第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 */

原创粉丝点击