码迷,mamicode.com
首页 > 编程语言 > 详细

最短路径 - 迪杰斯特拉算法

时间:2016-04-20 00:21:36      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:

和 普利姆算法 思想有点像

还是搞不懂到底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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!