参考

此题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;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

最新文章

  1. 2015最流行的Android组件、工具、框架大全
  2. 精心挑选10款优秀的 jQuery 图片左右滚动插件
  3. 通过OCCI连接oracle(C++)
  4. firebug常用工具
  5. SOME:收缩数据库日志文件,查看表数据量和空间占用,查看表结构索引修改时间
  6. 分享一个TP5实现Create()方法的心得
  7. Delphi7 安装ICS,与简单使用
  8. 第十课:CSS选择器的介绍和区分
  9. DEV GridControl表格数据源为空在表格中间显示提醒字符
  10. Firebase能改变什么(对SaaS,BaaS,PaaS,IaaS的解释比较清楚)
  11. Python进阶(面向对象编程基础)(一)
  12. 近段时间学习html和CSS的一些细碎总结
  13. 深入了解Libgdx中间Skin分类
  14. NYOJ201作业题
  15. [Go] 使用go语言解决现代编程难题
  16. AgilePoint数据库模式中当前所有表的列表
  17. Javascript中的this指向。
  18. [django]drf知识点梳理-权限
  19. synchronized的可见性理解
  20. poj 1300 欧拉图

热门文章

  1. ssm多数据源的操作
  2. PHP保存数组到数据库
  3. hive工作记录-20180513
  4. 搭建最小linux系统
  5. Chino 操作系统开发日志 (1) - 为 IoT 而生
  6. Java学习笔记二十九:一个Java面向对象的小练习
  7. Python学习笔记九:装饰器,生成器,迭代器
  8. EJS 模板中,js 如何获取后端传来的数据
  9. 参考 https://raspberrypi.stackexchange.com/questions/3617/how-to-install-unrar-nonfree &gt; 1.卸载unrar-free。 $ sudo apt-get remove unrar-free \ 2.通过编辑确保您拥有源存储库/etc/apt/sources.list。 $ cat /etc/apt/sources.
  10. c语言单向链表逆转实现方法