标签:
和 普利姆算法 思想有点像
还是搞不懂到底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