Dijkstra(邻接矩阵有向图)C 实现~
来源:互联网 发布:vue.js 2.0 radio 编辑:程序博客网 时间:2024/05/16 15:36
文件头:
#include<stdio.h> #include<stdlib.h> #include<ctype.h> #define NOTEXIST -1#define BEGIN -1 #define MAXVEX 100 #define INFINITY 65535 #define TRUE 1 #define FALSE 0 typedef int EdgeType;typedef char VertexType;int path[MAXVEX];int dist[MAXVEX];int known[MAXVEX];typedef struct Graph {VertexType vex[MAXVEX];EdgeType edge[MAXVEX][MAXVEX];int vex_num, edge_num;}Graph;
核心代码:
void init_graph(Graph *g, int end){int i;for (i = 0; i < g->vex_num; i++) {path[i] = NOTEXIST;known[i] = FALSE;dist[i] = INFINITY;}dist[end] = 0;}int find_min(Graph g){int min;min = INFINITY;int i;int index;for (i = 0; i < g.vex_num; i++) {if (known[i] == FALSE && dist[i] < min) {index = i;min = dist[i];}}if (min == INFINITY)return -1;elsereturn index;}void Dijkstra(Graph g){int v;int w;while (1) {v = find_min(g);//printf("v = %d", v);if (v == NOTEXIST)break;known[v] = TRUE;for (w = 0; w < g.vex_num; w++) {if (known[w] == FALSE && (dist[v] + g.edge[v][w] < dist[w])) {dist[w] = dist[v] + g.edge[v][w];path[w] = v;}}}}
完整实现:
#include<stdio.h> #include<stdlib.h> #include<ctype.h> #define NOTEXIST -1#define BEGIN -1 #define MAXVEX 100 #define INFINITY 65535 #define TRUE 1 #define FALSE 0 typedef int EdgeType;typedef char VertexType;int path[MAXVEX];int dist[MAXVEX];int known[MAXVEX];typedef struct Graph {VertexType vex[MAXVEX];EdgeType edge[MAXVEX][MAXVEX];int vex_num, edge_num;}Graph;char read_char(){char ch;do {ch = getchar();} while (!isalpha(ch));return ch;}int get_pos(Graph g, char ch){int i;for (i = 0; i < g.vex_num; i++) {if (g.vex[i] == ch)return i;}return -1;}void create_graph(Graph *g){int i, j, k;printf("请输入顶点数与边数:\n"); scanf("%d%d", &g->vex_num, &g->edge_num);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;}}printf("请输入顶点信息:\n"); for (i = 0; i < g->vex_num; i++) { g->vex[i] = read_char();}printf("请输入边的信息:\n"); char c1, c2;int p1, p2, w;for (k = 0; k < g->edge_num; k++) {c1 = read_char();c2 = read_char();scanf("%d", &w);p1 = get_pos(*g, c1);p2 = get_pos(*g, c2);g->edge[p1][p2] = w;//有向边的权重 }}void init_graph(Graph *g, int end){int i;for (i = 0; i < g->vex_num; i++) {path[i] = NOTEXIST;known[i] = FALSE;dist[i] = INFINITY;}dist[end] = 0;}int find_min(Graph g){int min;min = INFINITY;int i;int index;for (i = 0; i < g.vex_num; i++) {if (known[i] == FALSE && dist[i] < min) {index = i;min = dist[i];}}if (min == INFINITY)return -1;elsereturn index;}void Dijkstra(Graph g){int v;int w;while (1) {v = find_min(g);//printf("v = %d", v);if (v == NOTEXIST)break;known[v] = TRUE;for (w = 0; w < g.vex_num; w++) {if (known[w] == FALSE && (dist[v] + g.edge[v][w] < dist[w])) {dist[w] = dist[v] + g.edge[v][w];path[w] = v;}}}}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("%5c", '*');else {printf("%5d", g.edge[i][j]);}}printf("\n");}}void print_path2(Graph g, int end)//这里 直接传递最后位置的索引 {if (path[end] != BEGIN) {print_path2(g, path[end]);printf("->"); }printf("%c ", g.vex[end]);}int main(){Graph g;int start, end;char c1, c2;create_graph(&g);printf("请输入起始点与终点:\n");c1 = read_char();c2 = read_char();start = get_pos(g, c1);end = get_pos(g, c2);init_graph(&g,start);Dijkstra(g);if(dist[end] == INFINITY)printf("\n该两点间无路径.");else{printf("最短路径为:\n\n");print_path2(g, end);printf("\n\n最小花费 : %d",dist[end]);}getchar();getchar();getchar();return 0;}
阅读全文
1 0
- Dijkstra(邻接矩阵有向图)C 实现~
- 有向图邻接矩阵实现
- 有向图的DFS和BFS(邻接矩阵实现)
- 邻接矩阵实现的有向图
- 邻接矩阵有向图
- 邻接矩阵--有向图
- 邻接矩阵 有向图 判断是否有环 是否连通 DFS C实现~
- 邻接矩阵(有向图,无向图实现的差异)
- C++邻接矩阵实现有向图、无向图
- Dijkstra算法 求单源含权最短路径(邻接表有向图)C实现
- 有向图的创建(邻接矩阵)
- 数据结构之有向网邻接矩阵Dijkstra实现源点至其余各顶点最短路径
- 邻接矩阵存储有向图
- 邻接矩阵存储有向图
- 邻接矩阵、构造有向图
- 有向图的邻接矩阵
- 邻接矩阵有向图(一)之 C语言详解
- 数据结构之图用邻接矩阵实现赋值有向图
- jsp 表达式无效
- SQL join 子句中加入 top 子句嵌套 文章2
- hdu 1302 The Snail
- Java基础之抽象类和接口
- 2017年多校联合训练 第五场(吉如一)
- Dijkstra(邻接矩阵有向图)C 实现~
- java-常用API
- 标记 LoRaWAN介绍
- laravel 关联关系遍历数组
- 安卓通过SurfaceView类实现手写功能(下)
- spring注解 配置属性 Environment@PropertySource 配置数据源
- 2017 Multi-University Training Contest
- qt 获取网关
- UVA