zoukankan      html  css  js  c++  java
  • 最短路径之dijkstra算法的C语言实现


    Dijkstra算法解决的是单源最短路径问题:对于给定的有向网络G=(V,E)及单个源点v,求从v到G的其余各顶点的最短路径。

    本文以下面的有向网络(用邻接矩阵存储)为例,并假设源点为1。



    源程序如下:
    #include<stdio.h>
    #define maxsize 1000  //表示两点间不可达,距离为无穷远
    #define n 7  //结点的数目
    void dijkstra(int C[][n],int v);//求原点v到其余顶点的最短路径及其长度
    void main()
    {
     printf("                           ——Dijkstra算法—— ");
     int C[n][n]={
      {maxsize,13,8,maxsize,30,maxsize,32},
      {maxsize,maxsize,maxsize,maxsize,maxsize,9,7},
      {maxsize,maxsize,maxsize,5,maxsize,maxsize,maxsize},
      {maxsize,maxsize,maxsize,maxsize,6,maxsize,maxsize},
      {maxsize,maxsize,maxsize,maxsize,maxsize,2,maxsize},
      {maxsize,maxsize,maxsize,maxsize,maxsize,maxsize,17},
      {maxsize,maxsize,maxsize,maxsize,maxsize,maxsize,maxsize}
     },v=1,i,j;
     printf("【打印有向图的邻接矩阵】 ");
     for(i=0;i<n;i++)
     {
      for(j=0;j<n;j++)
      {
       printf(" %d",C[i][j]);
      }
      printf(" ");
     }
     printf("【打印原点1到其他各点的最短路径及其长度】 ");
     dijkstra(C,v);
    }
    void dijkstra(int C[][n],int v)//求原点v到其余顶点的最短路径及其长度
    //C为有向网络的带权邻接矩阵
    {
     int D[n];
     int P[n],S[n];
     int i,j,k,v1,pre;
     int min,max=maxsize,inf=1200;
     v1=v-1;
     for(i=0;i<n;i++)
     {
      D[i]=C[v1][i];   //置初始距离值
      if(D[i]!=max)
       P[i]=v;
      else
       P[i]=0;
     }
     for(i=0;i<n;i++)
      S[i]=0;      //红点集S开始为空
     S[v1]=1;D[v1]=0;    //开始点v送S
     for(i=0;i<n-1;i++)   //扩充红点集
     {
      min=inf;//令inf>max,保证距离值为max的蓝点能扩充到S中
      for(j=0;j<n;j++)//在当前蓝点中选距离值最小的点k+1
      {
       if((!S[j])&&(D[j]<min))
       {
        min=D[j];
        k=j;
       }
      }
      S[k]=1;    //将k+1加入红点集
      for(j=0;j<n;j++)
      {
       if((!S[j])&&(D[j]>D[k]+C[k][j]))//调整各蓝点的距离值
       {
        D[j]=D[k]+C[k][j];  //修改蓝点j+1的距离
        P[j]=k+1;     //k+1是j+1的前趋
       }
      }
     }  //所有顶点均已扩充到S中
     for(i=0;i<n;i++)
     {
      printf("%d到%d的最短距离为",v,i+1);
      printf("%d ",D[i]);  //打印结果
      pre=P[i];
      printf("路径:%d",i+1);
      while(pre!=0)  //继续找前趋顶点
      {
       printf("<——%d",pre);
       pre=P[pre-1];
      }
      printf(" ");
     }


    转载自http://blog.sina.com.cn/s/blog_686d0fb001012qze.html @月之幽境

  • 相关阅读:
    “XXXXX” is damaged and can’t be opened. You should move it to the Trash 解决方案
    深入浅出 eBPF 安全项目 Tracee
    Unity3d开发的知名大型游戏案例
    Unity 3D 拥有强大的编辑界面
    Unity 3D物理引擎详解
    Unity 3D图形用户界面及常用控件
    Unity 3D的视图与相应的基础操作方法
    Unity Technologies 公司开发的三维游戏制作引擎——Unity 3D
    重学计算机
    windows cmd用户操作,添加,设备管理员组,允许修改密码
  • 原文地址:https://www.cnblogs.com/tryitboy/p/4231168.html
Copyright © 2011-2022 走看看