讲解下面的代码 //最短路径—— Dijiksra //邻接矩阵 无向图 #include<stdio.h> #include<stdlib.h> #define Max 1001 #define MaxSize 100 //1)图的数据类型 typedef struct { int vertex[MaxSize];//存储点的信息 int edge[MaxSize][MaxSize];//存储便之间的邻接关系 int vertexNum,edgeNum;//点的个数,边的个数 }MGraph; //2)构造一个图 MGraph CreatGraph(int n,int m) { MGraph G; int i,j,a,b,c; //点 边 G.vertexNum=n; G.edgeNum=m; //点的信息 for(i=1;i<=G.vertexNum;i++) { G.vertex[i]=i; } //边邻接关系的初始化 for(i=1;i<=G.vertexNum;i++) { for(j=1;j<=G.vertexNum;j++) { if(i==j) { G.edge[i][j]=0; } else { G.edge[i][j]=Max; } } } //输入m行边的信息 for(i=1;i<=G.edgeNum;i++) { scanf("%d %d %d",&a,&b,&c); G.edge[a][b]=c; G.edge[b][a]=c;//无向图 } return G; } //3)核心算法 void Dijkstra(MGraph G, int v,int n)/*从源点v出发*/ { int i, k, num, dist[n],d[n]; //初始化 for (i = 2; i <=G.vertexNum; i++) { dist[i] = G.edge[v][i];//存储当前最短路径的长度 } for (num = 1; num < G.vertexNum; num++) { for (k = 2, i = 2; i <=G.vertexNum; i++) { if(dist[k]==0) { for(k=2;k<=G.vertexNum;k++) { if((dist[k]==0)&&(dist[k+1]!=0)) { k++; break; } } } if ((dist[i] != 0) && (dist[i] < dist[k])) { k = i; } } for (i = 2; i <=G.vertexNum; i++) { if (dist[i] > dist[k] + G.edge[k][i]) { dist[i] = dist[k] + G.edge[k][i]; } } d[k]=dist[k]; dist[k] = 0; } printf("%d",d[G.vertexNum]); } int main() { int n,m;//场所,边 scanf("%d %d",&n,&m); //创造 MGraph G; G=CreatGraph(n,m); //Dijksra int v; v=1; Dijkstra(G,v,n); return 0; }
时间: 2024-01-27 13:06:05 浏览: 79
Dijkstra算法求最短路径的C/C++程序
4星 · 用户满意度95%
这段代码实现了Dijkstra算法求无向图中的最短路径。下面是详细解释:
1.定义图的数据类型
定义了一个结构体MGraph,包含了存储点的信息和便之间的邻接关系,以及点的个数和边的个数。
2.构造一个图
CreatGraph函数用来构造一个无向图,通过输入点和边的信息来初始化邻接矩阵。其中,点的信息是顺序排列的,边的邻接关系初始化为最大值Max,表示不相邻。
3.核心算法
Dijkstra函数实现了Dijkstra算法,用来求从源点v到其它点的最短路径。首先,初始化dist数组,表示从源点v到其它点的当前最短路径的长度。然后,通过循环找到当前dist数组中最小的元素,设其下标为k,将其加入d数组中,并将其dist值设为0,表示已经找到了最短路径。接下来,更新dist数组,如果从源点v到点i的路径经过点k比当前的最短路径更短,则更新dist[i]的值。重复以上步骤,直到所有点都加入d数组中,此时d[G.vertexNum]的值即为从源点v到终点n的最短路径长度。
4.主函数
主函数中,先输入点和边的个数,构造一个图,然后调用Dijkstra函数求最短路径,并输出结果。
阅读全文