博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Dijkstra (邻接矩阵的另一种实现)
阅读量:4217 次
发布时间:2019-05-26

本文共 2499 字,大约阅读时间需要 8 分钟。

注意  区别于上一个Dijkstra的实现  这里利用 edge[0][j] 值 对 dist 赋值 

核心算法:

//本例 默认 起始点为 0  void Dijkstra(Graph g){	int i, j;	for (i = 0; i < g.vex_num; i++) {		dist[i] = g.edge[0][i];//    关键  , 0可以为任意顶点 		path[i] = -1;		known[i] = 0;	}	int min;	int u, v;	//算法核心 	for (i = 0; i < g.vex_num - 1; i++) {//顶点数少一次 一定可以遍历所有顶点了 		min = INFINITY;		for (j = 0; j < g.vex_num; j++) {			if (dist[j] < min && known[j] == 0) {				u = j;				min = dist[j];			}		}	known[u] = 1;	for (v = 0; v < g.vex_num; v++){		if (g.edge[u][v] < INFINITY && dist[v] > dist[u] + g.edge[u][v] && known[v] == 0)			{				dist[v] = dist[u] + g.edge[u][v];					path[v] = u;			} 		}	}	//打印 长度 	for(i = 0; i < g.vex_num; i++ ){		printf("%5d",dist[i]); 	}}
完整实现:
#include
#include
#define MAXVEX 100#define INFINITY 65535int path[MAXVEX];int known[MAXVEX];int dist[MAXVEX];typedef struct Graph { int vex[MAXVEX]; int edge[MAXVEX][MAXVEX]; int vex_num, edge_num;}Graph;void init_graph(Graph *g) // 重要: c 语言 值传递的特性 必须传递 指针 { int i, j; for (i = 0; i < g->vex_num; i++) { for (j = 0; j < g->vex_num; j++) { if (i == j) g->edge[i][j] = 0; else g->edge[i][j] = INFINITY; } }}void create_graph(Graph *g){ int i, j, k, w; scanf("%d%d",&g->vex_num,&g->edge_num); for (i = 0; i < g->vex_num; i++){ scanf("%d",&g->vex[i]); } init_graph(g); for (k = 0; k < g->edge_num; k++) { scanf("%d%d%d", &i, &j, &w); g->edge[i][j] = w; //g->edge[j][i] = w; //也可以是无向图 }}//本例 默认 起始点为 0 void Dijkstra(Graph g){ int i, j; for (i = 0; i < g.vex_num; i++) { dist[i] = g.edge[0][i];// 关键 , 0可以为任意顶点 path[i] = -1; known[i] = 0; } int min; int u, v; //算法核心 for (i = 0; i < g.vex_num - 1; i++) {//顶点数少一次 一定可以遍历所有顶点了 min = INFINITY; for (j = 0; j < g.vex_num; j++) { if (dist[j] < min && known[j] == 0) { u = j; min = dist[j]; } } known[u] = 1; for (v = 0; v < g.vex_num; v++){ if (g.edge[u][v] < INFINITY && dist[v] > dist[u] + g.edge[u][v] && known[v] == 0) { dist[v] = dist[u] + g.edge[u][v]; path[v] = u; } } } //打印 长度 for(i = 0; i < g.vex_num; i++ ){ printf("%5d",dist[i]); }}void print_graph(Graph g){ int i, j; for (i = 0; i < g.vex_num; i++) { for (j = 0; j < g.vex_num; j++) { if(g.edge[i][j] == INFINITY) printf("%5s","*"); else printf("%5d",g.edge[i][j]); } printf("\n"); }}void print_path(Graph g, int end) { if(path[end] != -1){ print_path(g, path[end]); printf("->"); } printf("%d",g.vex[end]); } int main(){ Graph g; create_graph(&g); Dijkstra(g); //print_graph(g); return 0;}

转载地址:http://nximi.baihongyu.com/

你可能感兴趣的文章
【屌丝程序的口才逆袭演讲稿50篇】第三篇:我的舍与得的2014[张振华.Jack]
查看>>
【屌丝程序的口才逆袭演讲稿50篇】第五篇:不要给自己找任何借口【张振华.Jack】
查看>>
【屌丝程序的口才逆袭演讲稿50篇】第七篇:请留意我们身边的风景 【张振华.Jack】
查看>>
【屌丝程序的口才逆袭演讲稿50篇】第八篇:坚持的力量 【张振华.Jack】
查看>>
【屌丝程序的口才逆袭演讲稿50篇】第九篇:春节那些事-过年回家不需要理由【张振华.Jack】
查看>>
【屌丝程序的口才逆袭演讲稿50篇】第十一篇:马云乌镇40分钟演讲实录【张振华.Jack】
查看>>
Java并发编程从入门到精通 张振华.Jack --我的书
查看>>
【屌丝程序的口才逆袭演讲稿50篇】第十二篇:世界上最快的捷径【张振华.Jack】
查看>>
Android中Java代码和XML布局效率问题
查看>>
android TextView属性大全(转)
查看>>
Conclusion for Resource Management
查看>>
Conclusion for Constructors,Destructors,and Assignment Operators
查看>>
Conclusion for Accustoming Yourself to C++
查看>>
面试题1:赋值运算函数(offer)
查看>>
Mark : MessagePack简介及使用
查看>>
Mark : hive文件存储格式
查看>>
mark : hadoop 四种压缩格式
查看>>
All Things OpenTSDB
查看>>
单例模式(singleton),工厂方法模式(factory),门面模式(facade)
查看>>
抽象模式,适配器模式(Adapter),模板方法模式(Template method)
查看>>