图论入门(2):Dijkstra算法(POJ 2387)
来源:互联网 发布:远程网络教育学历 编辑:程序博客网 时间:2024/06/05 07:24
Dijkstra算法是图论的基本算法,适用于求单源最短路径,同时它也是一种典型的贪心算法,所以它所得到的解未必就是最优解,这也是它的局限性。
以下是POJ上的模板题:http://poj.org/problem?id=2387
由于之前用链表做了多次结果一直RE,最后找不到bug只好看别人解法用数组完成。(RE的原因是因为链表中的节点都是在main函数内动态分配的,而动态分配太多,一般超过100左右就会自动RE, 声明成全局变量就可以了)
这一次我就不一一解释代码了,只说一下大概的思路(图用一个邻接矩阵来储存):
①Dijkstra算法首先将起点的权重设置为0,并将其余的点权重设置为无穷大,再设置一个标记数组记录有多少点已经遍历过(遍历过的点即默认当前点的权重为最短路径)。
②构造一个优先队列,将起点入队,再出队(出队意味着这个点已经被遍历同时要更新标记数组)并将起点邻接的没有记录的点入队,入队时应判断从当前点到邻接点距离是否小于邻接点的权重,若小于则应重新赋值入队点的权重。
③按照第二步的步骤,每一次将权重最小的点出队(能进队列肯定都是没有遍历过的点,贪心算法的体现)。结束的标志就是所有点都已经遍历了一遍。
④dijkstra算法优化的地方大概就是优先队列这里了,相比一般的优先队列,可以考虑用二叉堆来优化。(使用二叉堆优化的时候要考虑优先队列会有重复的两个编号值的问题,他们的权重却不一样,这是个致命bug相比直接查找来说,我将在入门3给出具体解释)
#include<stdio.h>#define SIZE 1005#define INT_MAX 10000000int map[SIZE][SIZE];int Path[SIZE];//记录最短路径int Flag[SIZE];int Find(int N){ int i; int result = -1; int min = INT_MAX; for(i = 1;i <= N;i++){ if(!Flag[i] && Path[i] < min){ min = Path[i]; result = i; } } return result;}void Dijkstra(int N){ int i, number; for(i = 1;i <= N;i++){ Path[i] = INT_MAX; Flag[i] = 0; } Path[N] = 0; number = Find(N); while(number != -1){ Flag[number] = 1; for(i = 1;i <= N;i++){ if(!Flag[i] && Path[number] + map[number][i] < Path[i]){ Path[i] = Path[number] + map[number][i]; } } number = Find(N); }}int main(void){ int T, N; scanf("%d%d", &T, &N); int i, j; for(i = 1;i <= N;i++){ for(j = 1;j <= N;j++){ map[i][j] = INT_MAX; } } int row, col, distance; for(i = 1;i <= T;i++){ scanf("%d%d%d", &row, &col, &distance); if(distance < map[row][col]){ map[row][col] = distance; map[col][row] = distance; } } Dijkstra(N); printf("%d ", Path[1]); return 0;}
0 0
- 图论入门(2):Dijkstra算法(POJ 2387)
- poj 2387 Dijkstra入门(动态图解)
- POJ 2387 (Dijkstra)
- POJ 2387 Til the Cows Come Home(Dijkstra算法)
- POJ 2387 Til the Cows Come Home(Dijkstra算法)
- poj 1125(Stockbroker Grapevine)Dijkstra算法
- POJ 2253 Frogger (dijkstra算法 + 预处理)
- POJ 1502 单源最短路(Dijkstra算法)
- poj-1502(最短路dijkstra算法)
- POJ 1797 Heavy Transportation(Dijkstra算法)
- 图-迪杰斯特拉(dijkstra)算法
- poj Subway(dijkstra)
- POJ 1062 枚举单源最短路径(dijkstra算法)
- POJ 1847 Tram(Dijkstra单源有向图最短路径算法)
- POJ 1502 MPI Maelstrom (Dijkstra算法+输入处理)
- POJ 3255 Roadblocks (次短路径 + Dijkstra算法)
- POJ 3268-Silver Cow Party(dijkstra算法)
- POJ 1797Heavy Transportation(dijkstra算法+优先队列优化)
- 初识 Openstack nova-api
- Arduino 平台与C语言程序设计-week1-Arduino Environment-Lesson2
- C 标准库 strcspn 函数的实现
- Android SQlite
- 文章标题
- 图论入门(2):Dijkstra算法(POJ 2387)
- Windows下LM-Hash与NTLM-Hash生成原理
- Gradle多渠道打包 (1)
- Java环境变量的作用
- zzuli OJ 1124: 两个有序数组合并
- 黑苹果安装傻瓜教程
- 通过左右滑动缩放图片
- Kmeans、Kmeans++和KNN算法比较
- 【iOS】UITbableView中cell的单选状态和多选状态