第7章 图——最短路径之某个源点到其余各顶点的最短路径
来源:互联网 发布:不是方阵有逆矩阵吗 编辑:程序博客网 时间:2024/05/22 23:28
/* * 这个程序是用迪杰斯特拉算法计算一个有向图中从源点v0到其他各个顶点的最短路径。 * 有向图的信息参照课本P188的图7.34 。 */#include<stdio.h>#include<string.h>#define MAX 1000000int visit[1010],min[1010],n; /*全局。*/typedef struct Mgraph{ /*以邻接矩阵存储的图类型,重点是思想,存储形式不重要。*/ int edges[100][100]; /*边的信息。*/ int n,e; }Mgraph; int createudg(Mgraph *G,int n,int e){ /*创建有n个顶点e条边的无向图*/ int i,j,u,v,value,k;for(j = 0;j<=n-1;j++){for(k = 0;k<=n-1;k++){if(j==k)G->edges[j][k] = 0;elseG->edges[j][k] = MAX;}}for(i = 0;i<=e-1;i++){scanf("%d%d%d",&u,&v,&value);/*记录每条边的起始点和权值。*/G->edges[u][v] = value;} return 0; } int dijkstra(Mgraph *G,int v0){int i,temp,u,pre[1010],j,k;for(i = 0;i<=n-1;i++) /*初始各定点都未访问过。*/visit[i] = 0;for(i = 0;i<=n-1;i++){min[i] = G->edges[v0][i]; /*各个顶点到源点的距离。*/if(i!=v0&&min[i]<MAX)pre[i] = v0; /*如果顶点和源点间存在路径,记录路径的起点。*/elsepre[i] = -1;}min[v0] = 0; /*初始化。*/visit[v0] = 1; /*初始化源点状态:已被访问过。*/for(i = 0;i<=n-1;i++){temp = MAX;u = v0;for(j = 0;j<=n-1;j++){ /*找到和源点之间的最短路径。*/if(visit[j]!=1&&min[j]<temp){temp = min[j];u = j;}}visit[u] = 1; /*又有一个顶点被访问过,即被确定。*/for(k = 0;k<=n-1;k++){if(visit[k]!=1&&G->edges[u][k]<MAX&&min[k]>min[u]+G->edges[u][k]){min[k] = min[u]+G->edges[u][k]; /*如果还未被确定的顶点和以确定集合之间的距离,即和刚才确定的点之前的点之间*/pre[k] = u; /*的距离大于确定了刚才的顶点之后它和集合之间的距离,就改变到达确定集合之间的路径。*/}}}return 0;}int main(){int i,e;Mgraph G;scanf("%d%d",&n,&e);createudg(&G,n,e);dijkstra(&G,0);for(i = 0;i<=n-1;i++){ /*输出源点到各个顶点之间的最小路径,*/if(min[i]<MAX) /*路径不存在就输出 -1 。*/printf("%d\n",min[i]);elseprintf("-1\n");}return 0;}/* * 测试: * 输入: * 6 8 顶点数、边数。 * 0 2 10 边的起点、终点、权值。 * 0 4 30 * 0 5 100 * 1 2 5 * 2 3 50 * 3 5 10 * 4 3 20 * 4 5 60 * 输出: * 0 * -1 * 10 * 50 * 30 * 60 */