参考

此题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算法详解 单源点最短路问题的更多相关文章

  1. ACM: HDU 1874 畅通工程续-Dijkstra算法

    HDU 1874 畅通工程续 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Desc ...

  2. hdu 1874 畅通工程续 Dijkstra

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 题目分析:输入起点和终点,顶点的个数,已连通的边. 输出起点到终点的最短路径,若不存在,输出-1 ...

  3. hdu 1874 畅通工程续 (dijkstra(不能用于负环))

    畅通工程续Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  4. hdu 1874 畅通工程续(求最短距离,dijkstra,floyd)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1874 /************************************************* ...

  5. HDU 1874畅通工程续(迪杰斯特拉算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Time Limit: 3000/1000 MS (Java/Others)     ...

  6. hdu 1874 畅通工程续

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过 ...

  7. HDU 1874 畅通工程续【Floyd算法实现】

    畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  8. HDU 1874 畅通工程续(最短路/spfa Dijkstra 邻接矩阵+邻接表)

    题目链接: 传送门 畅通工程续 Time Limit: 1000MS     Memory Limit: 65536K Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路. ...

  9. HDU——1874畅通工程续(Dijkstra与SPFA)

    畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

随机推荐

  1. AFNetworking 2.x 的SSL身份认证

    一般来讲如果app用了web service , 我们需要防止数据嗅探来保证数据安全.通常的做法是用ssl来连接以防止数据抓包和嗅探 其实这么做的话还是不够的.我们还需要防止中间人攻击(不明白的自己去 ...

  2. VUE 跳转另一页面返回之前页面刷新,但数据依然存在

    在第一个页面填写数据后存入本地缓存: 再次跳转回来时判断是否填入数据,如果有数据,将缓存数据填写上.

  3. JanusGraph 图数据库安装小记 ——以 JanusGraph 0.3.0 为例

    由于近期项目中有使用图数据的需求,经过对比,我们选择尝试使用 JanusGraph.本篇小记记录了我们安装 JanusGraph 以及需要一起集成的 Cassandra + Elasticsearch ...

  4. laravel5.5源码笔记(六、中间件)

    laravel中的中间件作为一个请求与响应的过滤器,主要分为两个功能. 1.在请求到达控制器层之前进行拦截与过滤,只有通过验证的请求才能到达controller层 2.或者是在controller中运 ...

  5. 全局变量和局部变量(global关键字)

    1.定义在函数外部的就是全局变量,它的作用域从定义处一直到文件结尾. 2.函数内定义的变量就是局部变量,它的作用域为函数定义范围内. 3.函数之间存在作用域互不影响. 4.函数内访问全局变量需要 gl ...

  6. Laravel框架定时任务2种实现方式示例

    本文实例讲述了Laravel框架定时任务2种实现方式.分享给大家供大家参考,具体如下: 第一种 1.生成一个commands文件 > php artisan make:command test ...

  7. 计算机专业C语言编程学习重点:指针化难为易

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...

  8. easyui树动态加载参考

    这篇文章是拷贝的,多谢原作者 友情连接:http://www.jb51.net/article/28771.htm var treeTitle = '选择列表'; var treeUrl = '../ ...

  9. 【转载】C/C++杂记:深入虚表结构

    原文:C/C++杂记:深入虚表结构 1. 虚表与“虚函数表” 在“C/C++杂记:虚函数的实现的基本原理”一文中曾提到“虚函数表”的概念,只是为了便于理解,事实是:虚函数表并不真的独立存在,它只是虚表 ...

  10. FFT&NTT总结

    FFT&NTT总结 一些概念 \(DFT:\)离散傅里叶变换\(\rightarrow O(n^2)\)计算多项式卷积 \(FFT:\)快速傅里叶变换\(\rightarrow O(nlogn ...