文件头:

#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;
}

Dijkstra(邻接矩阵有向图)C 实现~相关推荐

  1. 有向图邻接矩阵c语言编程,邻接矩阵有向图(一)之 C语言详解

    本章介绍邻接矩阵有向图.在"图的理论基础"中已经对图进行了理论介绍,这里就不再对图的概念进行重复说明了.和以往一样,本文会先给出C语言的实现:后续再分别给出C++和Java版本的实 ...

  2. 邻接矩阵有向图的介绍

    邻接矩阵有向图的介绍 邻接矩阵有向图是指通过邻接矩阵表示的有向图. 上面的图G2包含了"A,B,C,D,E,F,G"共7个顶点,而且包含了"<A,B>,< ...

  3. A Walk Through the Forest dijkstra(邻接矩阵)

    http://acm.hdu.edu.cn/showproblem.php?pid=1142 dijkstra(邻接矩阵) 1 #include <cstdio> 2 #include & ...

  4. Dijkstra算法--有向图的源点到其他顶点的最短路径(连接矩阵、邻接矩阵两种方式)

    引子: Dijkstra算法:某个顶点到其他顶点的最短路径. 以下面这个图为例:其中源点是A.关键点:维护一个二维数组,具体见下面: 1.首先,派一名调查员驻扎在A处,在A处,a调查员能够知道与A相连 ...

  5. 最短路径Dijkstra(邻接矩阵)

    #include "stdafx.h" #include <iostream> #include <fstream> #include <Window ...

  6. ACM模板--邻接矩阵 有向图 搜索算法

    /*** C++: 邻接矩阵图** @author judyge* @date 2014/04/19*/#include <iomanip> #include <iostream&g ...

  7. ACM模板--邻接矩阵 有向图

    /*** C++: 邻接矩阵图** @author judyge* @date 2014/04/19*/#include <iomanip> #include <iostream&g ...

  8. 有向图,无向图的邻接矩阵和邻接表模板

    图 图的定义 有向图 概念 模板 邻接矩阵 邻接表 无向图 概念 模板 邻接矩阵 邻接表 简单图 完全图 图的定义 图 GGG 由顶点集 VVV 和边集 EEE 组成,记为 G=(V,E)G=(V,E ...

  9. 邻接矩阵用c语言,邻接矩阵无向图(一)之 C语言详解

    本章介绍邻接矩阵无向图.在"图的理论基础"中已经对图进行了理论介绍,这里就不再对图的概念进行重复说明了.和以往一样,本文会先给出C语言的实现:后续再分别给出C++和Java版本的实 ...

最新文章

  1. iOS开发笔记 -- 推送证书的创建及合并
  2. python重复执行_关于计时器:在Python中每x秒重复执行一次函数的最佳方法是什么?...
  3. nodejs后台启动
  4. 哈·曼丁的故事(三)
  5. 经典语句,看看让心灵宁静
  6. idea代码可以编译但是爆红_推荐一款 IDEA 生成代码神器,写代码再也不用加班了...
  7. Leetcode重点250题
  8. 凭几句话的方案,你什么也做不了
  9. 一键式安装Ubuntu 18.04和Win10双系统并超频的防坑指南
  10. ffmpeg推流和拉流rtsp
  11. Modbus转Profinet网关与ARX-MA100微型空气质量监测系统配置案例
  12. 定积分证明题例题_一个广义积分不等式证明(送给数学分析同学)
  13. OpenStack基金会更名,开源基础设施开启新十年
  14. 外媒预测2015年十大最热门工作
  15. 层次化局域网模型 - 核心层、汇聚层、接入层
  16. JAVA数据类型与转换
  17. PC游戏史上十大最经典RPG
  18. Java多线程性能优化
  19. prompt learning 提示学习初步心得及示例 代码
  20. stm32F103RCT6串口ttl烧录代码手把手教学

热门文章

  1. idea破解 2018.2.3
  2. 数据扩充和数据预处理
  3. 步步高java短信恢复,步步高智能手机忘记短信密码如何处理
  4. 快速幂-Jxc军训 (费马小定理+求概率)(2021-08-17)
  5. 网络通(修复网络、ip切换、局域网ip扫描、安全设置等)
  6. 视频直播app源码,底部动画导航栏
  7. 知识图谱 | (3) 知识图谱技术综述(下)
  8. ubuntu20安装ukylin企业微信记录
  9. P2P网贷-借款与发标
  10. h3c imos(V1.08) 获取当前监视器实况及轮切信息