标签:
和 普利姆算法 思想有点像
还是搞不懂到底p数组到底有什么用
#include<cstdio> #include<cstring> #include<cstdlib> #define MAXVEX 9 #define INFINITY 655 typedef struct { char vexs[MAXVEX]; int matirx[MAXVEX][MAXVEX]; int numVextexes,numEdges; }MGraph; void ShortestPath_Dijkstra(MGraph G,int v0){ int v,w,k,min; int i; int p[MAXVEX],d[MAXVEX]; //还是没懂这个p数组 到底起了什么作用 int final[MAXVEX]; for(v=0;v<G.numVextexes;v++){ final[v] = 0; (d)[v] = G.matirx[v0][v]; (p)[v] = 0; } (d)[v0] = 0; final[v0] = 1; for(v=1;v<G.numVextexes;v++){ min = INFINITY; for(w=0;w<G.numVextexes;w++){ if(!final[w] && (d)[w]<min){ k = w; min = (d)[w]; } } final[k] = 1; for(w=0;w<G.numVextexes;w++){ if(!final[w] && (min+G.matirx[k][w])<(d)[w]){ (d)[w] = min+G.matirx[k][w]; (p)[w] = k; } } } for(v=0;v<G.numVextexes;v++){ if(v != v0) printf("%d -> %d = %d\n",v0,v,(d)[v]); } } void InitGraph(MGraph *G){ int i,j; for(i=0;i<G->numVextexes;i++){ for(j=0;j<G->numVextexes;j++){ G->matirx[i][j] = INFINITY; } } return; } void CreateGraph(MGraph *G){ int i,j; int begin,end,weight; printf("输入顶点数和边数:\n"); scanf("%d %d",&G->numVextexes,&G->numEdges); InitGraph(G); for(i=0;i<G->numEdges;i++){ scanf("%d %d %d",&begin,&end,&weight); G->matirx[begin][end] = G->matirx[end][begin] = weight; } return; } int main(){ MGraph G; CreateGraph(&G); ShortestPath_Dijkstra(G,0);//可修改起点 return 0; }
标签:
原文地址:http://www.cnblogs.com/zhuozhuo/p/5410609.html