HDU 1874 畅通工程续-- Dijkstra算法详解 单源点最短路问题
来源:互联网 发布:压缩感知算法 编辑:程序博客网 时间:2024/05/18 18:20
参考
此题Dijkstra算法,一次AC。这个算法时间复杂度O(n2)附上该算法的演示图(来自维基百科):
附上: 迪科斯彻算法分解(优酷)
problem link -> HDU 1874
// HDU 1874 畅通工程续 -- 单源点最短路问题// 邻接矩阵 + Dijkstra// N 个村庄如果连通// 最少拥有 N-1 条道路, 最多拥有 N(N-1)/2条道路// 前提是任何两个村庄之间最多一条直达通道,但这个题目却有重复输入/* test data12 141 3 15 1 45 8 38 2 68 4 35 4 13 9 59 10 29 7 76 3 46 4 44 7 510 7 35 6 21 4=53 30 1 10 2 31 2 10 2=23 10 1 11 2=-1*/#include <cstdio>#include <iostream>#include <algorithm>using namespace std;const int infinite = (1<<30); // 定义正无穷大(不能定义为((1<<31)-1)因为再相加会溢出) (~正无穷大 == 负无穷大)const int MAXV = 101; // 村庄最多的个数int via[MAXV][MAXV]; // 邻接矩阵int n_villages,n_vias;int d[MAXV]; // 源点S 距 点Pi的距离=d[i]bool flag[MAXV]; // 标记不找回头路int Dijkstra(int s,int e,int n){ // 最终结果 即最短路程 若不存在则-1int min1 = s,min2 = 0; // via 的权值min1初始为0for (int i = 0; i < MAXV ;i++)d[i] = infinite;while(min1 != e && min1 != infinite){// 找到了终点或者是找遍了整个集合 flag[min1] = true;int temp1=infinite,temp2=infinite;for (int i = 0; i < n; i++ ){ //以 [0]-- 1 --- [1] 为例;一开始标记了flag[0]=true so跳过if (flag[i]) continue; // | | //找到via[1][min1(此时为0)]发现比较小 数值先存起来//| 3--[2] --1| //继续找via[2][0]发现比之前的大 不存if (min2 + via[i][min1] < d[i]){ //把之前找到的那个较短值的点给min1(变成1)标记[1]为trued[i] = min2 + via[i][min1]; //现在我们要做的就是该点加上之前那个最小的权看会不会比 via[i][min1]小 继续找}if (temp2 > d[i]){temp2 = d[i];temp1 = i;}}min2 = temp2; min1 = temp1;}return (d[e] == infinite) ? (-1) : (d[e]);}void init(){for (int i = 0 ; i < MAXV; i++){for (int j = 0; j < MAXV ;j++)via[i][j] = infinite;flag[i] = false; //初始化 标记数组为 每个点都是false}for (int i = 0; i < n_vias; i++){int a,b,d;scanf("%d%d%d",&a,&b,&d);if (via[a][b] > d){ // 排除输入重复的边via[a][b] = d;via[b][a] = d;}}}int main(){//freopen("in.txt","r",stdin);while( scanf("%d%d",&n_villages,&n_vias) != EOF ){//城镇数 和 道路数init(); // 初始化 + 输入int start,end;scanf("%d%d",&start,&end);if (start == end) {cout << "0" << endl;continue;} // 起点终点相同cout << Dijkstra(start,end,n_villages) << endl;}return 0;}
0 0
- 【解题报告】HDU 1874 畅通工程续 -- Dijkstra算法详解 单源点最短路问题
- HDU 1874 畅通工程续-- Dijkstra算法详解 单源点最短路问题
- HDU 1874 畅通工程续 / dijkstra算法 最短路实现
- hdu 1874畅通工程续+2544最短路+3790最短路径(dijkstra算法入门题)
- HDOJ/HDU---1874 畅通工程续 最短路(dijkstra)
- HDU 1874 畅通工程续【最短路 dijkstra & floyed & SPFA 】
- #HDU 1874 畅通工程续 【Dijkstra最短路】
- 【HDU】-1874-畅通工程续(最短路)(dijkstra)
- 最短路 Dijkstra Floyd HDU 1874 畅通工程续
- hdu 1874 畅通工程续(最短路的dijkstra算法实现&&Floyd算法实现)
- HDU 1874 畅通工程续【最短路,Dijkstra算法+spfa算法】
- HDU 1874 畅通工程续【最短路,qscqesze直播代码,pair建图,spfa,DIjkstra算法】
- 【最短路径dijkstra算法】HDU 1874---畅通工程续
- HDU 1874 畅通工程续 最短路算法检验题
- HDU-1874 畅通工程续 最短路算法模板
- HDU1874 畅通工程续 解题报告--最短路dijkstra算法
- HDU1874畅通工程续 (Dijkstra算法求最短路)
- 最短路(Dijkstra(迪杰斯特拉)算法)B - 畅通工程续
- 2014 -- ASP.NET 面试题
- MySQL联结表
- Linux下设置定期执行脚本
- hibernate.hbm2ddl.auto参数及其含义
- 定时器系统
- HDU 1874 畅通工程续-- Dijkstra算法详解 单源点最短路问题
- Unity3d 2D动画之Blend Trees 学习
- 2014 -- android 面试题
- 链表
- 二十世纪最伟大的10大算法
- 博弈论中的尼姆博弈
- [cocos2dx]学习 屏幕适配与其解决方案
- MyEclipse has detected that less than 5% of the 64MB of Perm Gen (Non-heap memor
- 关于Apache配置的过程笔记