Dijkstra (邻接矩阵的另一种实现)
来源:互联网 发布:海南大学网络登录入口 编辑:程序博客网 时间:2024/05/31 18:58
注意 区别于上一个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<stdio.h>#include<stdlib.h>#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;elseg->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","*");elseprintf("%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;}
阅读全文
0 0
- Dijkstra (邻接矩阵的另一种实现)
- 图的邻接矩阵实现(包括PRIM和DIJKSTRA算法)
- Dijkstra模板(邻接矩阵)
- 普通dijkstra(邻接矩阵)
- Dijkstra算法之邻接矩阵实现
- [数据结构] 邻接矩阵实现Dijkstra算法
- 【数据结构】Dijkstra求最短路径的图的邻接矩阵的实现
- 图的邻接矩阵表示与最短路径算法( Dijkstra )代码实现
- 最短路径算法之Dijkstra算法(邻接矩阵实现)
- Dijkstra(邻接矩阵有向图)C 实现~
- 邻接矩阵的dijkstra算法 迭代法以及使用PriorityQueue的java实现
- 堆(优先队列)优化dijkstra(邻接矩阵)
- Dijkstra单源最短路,邻接矩阵形式(模板)
- POJ1556 计算几何+Dijkstra(邻接矩阵)
- 最短路径(二)—Dijkstra算法(通过边实现松弛:邻接矩阵)
- 【算法】Dijkstra算法(单源最短路径问题) 邻接矩阵和邻接表实现
- Dijkstra算法实现类—邻接矩阵,一般实现
- (12.15)图的邻接矩阵实现
- 最长上升子序列
- 自动装箱与对象一致性判断
- 1 面试流程
- kafka初步认识
- HashMap中如果key是自定义的类,为什么重写hashcode()和equals()
- Dijkstra (邻接矩阵的另一种实现)
- 半深入理解CSS3 object-position/object-fit属性
- 《Python基础教程》学习笔记——函数
- Android学习(五)Service学习(下)
- swiper如何实现动画效果-小练习初级入门
- # 仿QQ底部导航栏的自定义view
- 1037. 在霍格沃茨找零钱(20)
- PHP解决json_encode中文变成unicode编码
- 大数据学习笔记:在eclipse上使用Ant插件实现自动编译打包