图的邻接矩阵--Dijkstra算法
图的邻接矩阵--**Dijkstra算法**
//代码附有详细注释
完整代码在我的资源中有。
常量,用于表示图中的无穷(max)和顶点个数(n)
不同的图对应不同的顶点个数。
1 #define max 1000 2 #define n 5
方便理解的别名,代码越长越有优势
typedef int Graph[n][n]; //图 //typedef <元素类型关键字><数组类型名>[<常量表达式1>][<常量表达式2>] typedef int vertex; //顶点
算法核心
G为已存在的图,v表示源点,dist数组用于辅助查找搜索
1 void shortp(Graph G, vertex v, int dist[n]) 2 //源点v 3 //dist[n]表示当前所找到的从源点v到终点Vi的最短路径长度 4 { 5 int i, wmin, u, S[n]; 6 //wmin代表一次搜索过程中最小值,u代表其最小值指向的顶点 7 int num=1; 8 for (i=0; i<n; i++)//数组dist及集合S赋初值 9 { 10 dist[i]=G[v][i]; 11 S[i]=0; 12 } 13 S[v]=1; //把顶点v加入集合S中,1表示在集合S当中,0表示不在集合S中 14 do{ 15 wmin=max; 16 u=v; 17 for(i=0; i<n; i++) //选择顶点u 18 { 19 if (S[i] == 0) //不在集合S中的顶点 20 { 21 if (dist[i] < wmin) //找到最小值及其顶点 22 { 23 u=i; 24 wmin=dist[i]; 25 } 26 } 27 } 28 S[u]=1; //把找到的顶点加入到集合S中 29 for (i=0; i<n; i++) 30 { 31 if (S[i] == 0) //不在集合S中的顶点 32 { 33 if (dist[u]+G[u][i] < dist[i]) //u为最小值指向的顶点,dist[u]+G[u][i]表示从源点v0先到顶点u再到其他顶点的路径,dist[i]表示从源点v0直接到其他顶点的路径 34 dist[i]=dist[u]+G[u][i]; //取两者最小的作为源点v0直接到其他顶点的路径 35 } 36 } 37 num++; 38 }while (num != n-1); 39 }
主函数用于测验,图设置为有向网图
1 void main() 2 { 3 Graph G={ 4 { 0, 10,10000, 30, 100}, 5 {10000, 0, 50,10000,10000}, 6 {10000,10000, 0,10000, 10}, 7 {10000,10000, 20, 0, 60}, 8 {10000,10000,10000,10000, 0}}; 9 vertex v=0; //源点v 10 int dist[n], i, j; 11 printf("please input weight of Graph ( 10000 is NaN ):\n"); 12 for(i=0; i<n; i++) 13 { 14 for(j=0; j<n; j++) printf("%5d ", G[i][j]); 15 printf("\n"); 16 } 17 printf("\n"); 18 shortp(G, v, dist); 19 for (i=0; i<n; i++) 20 if (i != v) 21 printf("the shortest path of v[%d]->[%d] is:%d\n",v,i,dist[i]); 22 printf("\n"); 23 }
最后,如果觉得这篇博客能帮助到你,请点赞、关注、收藏,后续我会持续更新,谢谢。

浙公网安备 33010602011771号