• 最短路径之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 @月之幽境

  • 相关阅读:
    iOS开篇——UI之UIStepper (计步器)
    iOS开篇——UI之UISegmentedControl (分段选择器)
    iOS开篇——UI之ProgressView(进度条)
    iOS开篇——UI之UAlertView(提示框)
    iOS开篇——UI之UIActivityIndicatorView(菊花)
    iOS开篇——UI之UIActionSheet
    iOS开篇——UI之UINavigationController
    iOS开篇——UI之UIViewController
    iOS开篇——UI之UIImageView
    iOS开篇——UI之UIView
  • 原文地址:https://www.cnblogs.com/tryitboy/p/4231168.html
Copyright © 2020-2023  润新知