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