Dijkstra算法求单源最短路径

来源:互联网 发布:淘宝可以延长几天收货 编辑:程序博客网 时间:2024/05/21 14:10

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. 结果


原创粉丝点击