1. 代码
/*
Dijkstra算法求单源最短路径
*/
#include<stdio.h>
#include<stdlib.h>
#define VEXSIZE 100
//建立邻接矩阵
int creat(int cost[][VEXSIZE])
{
int vexnum, edgnum;
int v1, v2, w;
int i, j;
printf("输入顶点数和边数:\nvexnum,edgnum=");
scanf("%d,%d", &vexnum, &edgnum);
for(i=1;i<=vexnum;i++)
for(j=1;j<=vexnum;j++)
cost[i][j]=32767; //代表无穷
printf("输入边的起点,终点,权:\n");
for(i=1;i<=edgnum;i++)
{
printf("v1,v2,w= ");
scanf("%d,%d,%d", &v1, &v2, &w);
cost[v1][v2]=w;
}
return vexnum;
}
//Dijkstra算法
void Dijkstra(int cost[][VEXSIZE], int vexnum)
{
int v1;
int i, j;
//dist[i]存储 c1-vi的距离;path[i]存储直接前驱 ;s[]=1,0表示已,未找到最短路径
int dist[vexnum+1], path[vexnum+1], s[vexnum+1];
printf("输入源点:\n");
scanf("%d", &v1);
//初始化各数组
for(i=1;i<=vexnum;i++)
{
dist[i]=cost[v1][i];
s[i]=0;
if(dist[i]<32767)
path[i]=v1;
}
s[v1]=1;
//每次循坏,目的是找到一个顶点的最短路径(使某个s[i]=1 )并存储在dist[i]
for(i=1;i<=vexnum;i++)
{
//if(i==v1)
// continue;
int min, locmin;
min=32767;
//每次循坏,目的是寻找最小dist[]及其位置(对应顶点)
for(j=1;j<=vexnum;j++)
{
if(s[j]==0 && min>dist[j])
{
min=dist[j];
locmin=j;
}
}
s[locmin]=1; //加入顶点locmin
//dist[locmin]=min; /*在上面循环中已经实现,加上会出现莫名其妙的错误*/
//path[]默认v1, 此处不必修改
//locmin加入后,修改dist[],path[]
for(j=1;j<=vexnum;j++)
if(s[j]==0 && dist[locmin]+cost[locmin][j]<dist[j])
{
dist[j]=dist[locmin]+cost[locmin][j];
path[j]=locmin;
}
}
//输出每一顶点的最短路径
printf("输出Dijkstra排序结果:\n");
for(i=1;i<=vexnum;i++)
{
int x=i;
if(x==v1)
continue;
if(s[x]==1) //!!!s[x]==1
{
while(x!=v1)
{
printf("%d<--", x);
x=path[x];
}
printf("%d %d\n",x,dist[i]);
}
else printf("32767\n");
}
}
int main()
{
int vexnum;
int cost[VEXSIZE][VEXSIZE];
vexnum=creat(cost);
Dijkstra(cost, vexnum);
return 0;
}
2. 结果