最短路徑之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算法——\n");
 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("【打印有向圖的鄰接矩陣】\n");
 for(i=0;i<n;i++)
 {
  for(j=0;j<n;j++)
  {
   printf("\t%d",C[i][j]);
  }
  printf("\n");
 }
 printf("【打印原點1到其他各點的最短路徑及其長度】\n");
 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\n",D[i]);  //打印結果
  pre=P[i];
  printf("路徑:%d",i+1);
  while(pre!=0)  //繼續找前趨頂點
  {
   printf("<——%d",pre);
   pre=P[pre-1];
  }
  printf("\n");
 }


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM