HDU 1874 畅通工程续-- Dijkstra算法详解 单源点最短路问题
此题Dijkstra算法,一次AC。这个算法时间复杂度O(n2)附上该算法的演示图(来自维基百科):
附上: 迪科斯彻算法分解(优酷)
problem link -> HDU
1874
- // HDU 1874 畅通工程续 -- 单源点最短路问题
- // 邻接矩阵 + Dijkstra
- // N 个村庄如果连通
- // 最少拥有 N-1 条道路, 最多拥有 N(N-1)/2条道路
- // 前提是任何两个村庄之间最多一条直达通道,但这个题目却有重复输入
- /* test data
- 12 14
- 1 3 1
- 5 1 4
- 5 8 3
- 8 2 6
- 8 4 3
- 5 4 1
- 3 9 5
- 9 10 2
- 9 7 7
- 6 3 4
- 6 4 4
- 4 7 5
- 10 7 3
- 5 6 2
- 1 4
- =5
- 3 3
- 0 1 1
- 0 2 3
- 1 2 1
- 0 2
- =2
- 3 1
- 0 1 1
- 1 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){ // 最终结果 即最短路程 若不存在则-1
- int min1 = s,min2 = 0; // via 的权值min1初始为0
- for (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]为true
- d[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;
- }
版权声明:本文为博主原创文章,未经博主允许不得转载。
HDU 1874 畅通工程续-- Dijkstra算法详解 单源点最短路问题的更多相关文章
- ACM: HDU 1874 畅通工程续-Dijkstra算法
HDU 1874 畅通工程续 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Desc ...
- hdu 1874 畅通工程续 Dijkstra
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 题目分析:输入起点和终点,顶点的个数,已连通的边. 输出起点到终点的最短路径,若不存在,输出-1 ...
- hdu 1874 畅通工程续 (dijkstra(不能用于负环))
畅通工程续Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- hdu 1874 畅通工程续(求最短距离,dijkstra,floyd)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1874 /************************************************* ...
- HDU 1874畅通工程续(迪杰斯特拉算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Time Limit: 3000/1000 MS (Java/Others) ...
- hdu 1874 畅通工程续
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过 ...
- HDU 1874 畅通工程续【Floyd算法实现】
畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- HDU 1874 畅通工程续(最短路/spfa Dijkstra 邻接矩阵+邻接表)
题目链接: 传送门 畅通工程续 Time Limit: 1000MS Memory Limit: 65536K Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路. ...
- HDU——1874畅通工程续(Dijkstra与SPFA)
畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
随机推荐
- ionic2添加支付宝插件出现问题
安装本地路径插件正常 编译正常 在打开支付页面时候 就报这个错 在手机app点击无效 错误信息: ERROR Error: Uncaught (in promise): Error: No pro ...
- Myeclipse报错:The word is not correctly spelled
在eclipse下的Window--Preference输入spell,然后把第一个复选框“Enable spell checking"给去掉就可以了.
- jdbc之Statement和Preparement
Jdbc DML 操作 Statement:静态SQL操作 每次操作都会将sql语句提交到数据库执行一次,性能比较低 // 1.加载驱动程序 Class.forName(driverName); // ...
- C语言中赋值表达式的返回值是什么?
我们或多或少都有过,或者见过将赋值表达式参与运算的情况.这通常会伴随着一些意想不到的问题.今天我就见到了一段奇怪的代码: #include<stdio.h> int main() { ; ...
- 转:c# Linq 的分页[转]
转:http://www.cnblogs.com/leleroyn/archive/2008/05/14/1196811.html 很多学习Linq的朋友肯定有自己所不同的方法,考虑这个问题我所想到的 ...
- NetWork——TCP的流量控制和拥塞控制
,然后开始执行拥塞避免算法,使拥塞窗口缓慢地线性增大. 这里为什么替换掉了慢开始算法呢,这是因为收到重复的ACK不仅仅告诉我们一个分组丢失了,由于接收方只有在收到另一个报文段时才会产生重复的ACK,所 ...
- [agc011F]Train Service Planning-[线段树优化dp+神秘思考题]
Description 传送门 Solution 请围观lhx大佬的博客(大佬写的太好了我都没有写的动力了em) Code #include<iostream> #include<c ...
- day6 网络 HTML模板
1.HTML模板 HTML模板 baidu一下 http://www.cssmoban.com/ http://www.cnblogs.com/web-d/archive/2010/04/16/171 ...
- js创建对象 object.create()用法
Object.create()方法是ECMAScript 5中新增的方法,这个方法用于创建一个新对象.被创建的对象继承另一个对象的原型,在创建新对象时可以指定一些属性. 语法: Object.crea ...
- python爬虫入门之URL
python爬虫,顾名思义是爬取信息的.大数据时代,信息的获取是非常关键的,它甚至能决定一个公司大发展的方向与未来,互联网就好像一张大网,人们想要获取信息就要从这张大网里爬取,这种手段也可以称为搜索引 ...