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 @月之幽境

  • 相关阅读:
    Http协议(一)基础知识
    Redis问题汇总
    Sql Server存储过程传递XML参数
    C# Redis
    Task的异常捕获和处理方法
    Entity Framework教程
    WebBrowser 弹窗体关闭原理
    C# 虹软SDK视频人脸识别和注册
    C#性能优化:延迟初始化Lazy
    DZ 特殊主题简单开发教程
  • 原文地址:https://www.cnblogs.com/tryitboy/p/4231168.html
Copyright © 2011-2022 走看看