HDU 1874 畅通工程续 (Dijkstra , Floyd , SPFA, Bellman_Ford 四种算法)

畅通工程续

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

Problem Description

某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。
现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。

   

Input

本题目包含多组数据,请处理到文件结束。 每组数据第一行包含两个正整数NM(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0N-1编号。 接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城镇A和城镇B之间有一条长度为X的双向道路。 再接下一行有两个整数S,T(0<=S,T<N),分别代表起点和终点。

   

Output

对于每组数据,请在一行里输出最短需要行走的距离。如果不存在从ST的路线,就输出-1.

   

Sample Input

   

3 3

0 1 1

0 2 3

1 2 1

0 2

3 1

0 1 1

1 2

   

Sample Output

   

2

-1

   

Author

linle

   

Source

2008浙大研究生复试热身赛(2——全真模拟

解法一:Dijkstra算法

   

#include<iostream>

#include<cstdio>

#include<cstring>

 

using namespace std;

 

const int INF=0x3f3f3f3f;

const int N=210;

 

int n,m,s,t;

int map[N][N],dis[N],vis[N];

 

void Dijkstra(int src){

int i;

for(i=0;i<n;i++){

dis[i]=map[src][i];

vis[i]=0;

}

dis[src]=0;

vis[src]=1;

int j,k,tmp;

for(i=0;i<n;i++){

tmp=INF;

for(j=0;j<n;j++)

if(!vis[j] && tmp>dis[j]){

k=j;

tmp=dis[j];

}

if(tmp==INF)

break;

vis[k]=1;

for(j=0;j<n;j++)

if(!vis[j] && dis[j]>dis[k]+map[k][j])

dis[j]=dis[k]+map[k][j];

}

}

 

int main(){

 

//freopen("input.txt","r",stdin);

 

while(~scanf("%d%d",&n,&m)){

int u,v,w;

for(int i=0;i<n;i++)

for(int j=0;j<n;j++)

map[i][j]=INF;

for(int i=0;i<m;i++){

scanf("%d%d%d",&u,&v,&w);

if(map[u][v]>w)

map[u][v]=map[v][u]=w;

}

scanf("%d%d",&s,&t);

Dijkstra(s);

if(dis[t]==INF)

printf("-1\n");

else

printf("%d\n",dis[t]);

}

return 0;

}

   

   

   

解法二:SPFA算法

   

#include<stdio.h>

#include<iostream>

#include<queue>

 

using namespace std;

 

#define N 205

#define INF 99999999

 

int n,m,map[N][N];

int visited[N],dis[N];

 

int SPFA(int src,int des){

int i;

for(i=0;i<n;i++){

dis[i]=INF;

visited[i]=0;

}

queue<int> myqueue;

while(!myqueue.empty())

myqueue.pop();

dis[src]=0;

visited[src]=1;

myqueue.push(src);

int tmp;

while(!myqueue.empty()){

tmp=myqueue.front();

myqueue.pop();

visited[tmp]=0;

for(i=0;i<n;i++)

if(dis[i]>dis[tmp]+map[tmp][i]){

dis[i]=dis[tmp]+map[tmp][i];

if(!visited[i]){

visited[i]=1;

myqueue.push(i);

}

}

}

return dis[des];

}

 

int main(){

int u,v,cost;

while(scanf("%d%d",&n,&m)!=EOF){

int i,j;

for(i=0;i<n;i++)

for(j=0;j<n;j++)

map[i][j]=INF;

for(i=0;i<m;i++){

scanf("%d%d%d",&u,&v,&cost);

if(cost<map[u][v])

map[u][v]=map[v][u]=cost;

}

int s,t;

scanf("%d%d",&s,&t);

int ans=SPFA(s,t);

if(ans<INF)

printf("%d\n",ans);

else

printf("-1\n");

}

return 0;

}

   

解法三:Floyd算法

   

#include<iostream>

#include<queue>

#include<cstdio>

#include<cstring>

 

using namespace std;

 

const int INF=0x3f3f3f3f;

const int N=210;

 

int n,m;

int map[N][N];

 

void Floyd(){

int i,j,k;

for(k=0;k<n;k++)

for(i=0;i<n;i++)

for(j=0;j<n;j++)

if(map[i][j]>map[i][k]+map[k][j])

map[i][j]=map[i][k]+map[k][j];

}

 

int main(){

 

//freopen("input.txt","r",stdin);

 

while(~scanf("%d%d",&n,&m)){

int i,j;

for(i=0;i<n;i++)

for(j=0;j<n;j++)

map[i][j]=(i==j?0:INF); //注意自身和自身距离为0

int u,v,w;

for(i=0;i<m;i++){

scanf("%d%d%d",&u,&v,&w);

if(map[u][v]>w)

map[u][v]=map[v][u]=w;

}

int s,t;

scanf("%d%d",&s,&t);

Floyd();

if(map[s][t]==INF)

printf("-1\n");

else

printf("%d\n",map[s][t]);

}

return 0;

}

   

Bellman_Ford

#include<iostream>

#include<queue>

#include<cstdio>

#include<cstring>

 

using namespace std;

 

const int INF=0x3f3f3f3f;

const int N=210;

 

int n,m,cnt;

int dis[N];

 

struct node{

int u,v;

int w;

}edge[1010*2];

 

void addedge(int u,int v,int w){

edge[cnt].u=u; edge[cnt].v=v; edge[cnt].w=w;

cnt++;

edge[cnt].u=v; edge[cnt].v=u; edge[cnt].w=w;

cnt++;

}

 

int Bellman_Ford(int src,int des){

int i,k;

for(i=0;i<n;i++)

dis[i]=INF;

dis[src]=0;

for(k=0;k<n-1;k++)

for(i=0;i<cnt;i++)

if(dis[edge[i].u]!=INF && dis[edge[i].v]>dis[edge[i].u]+edge[i].w)

dis[edge[i].v]=dis[edge[i].u]+edge[i].w;

return dis[des]==INF?-1:dis[des];

}

 

int main(){

 

//freopen("input.txt","r",stdin);

 

while(~scanf("%d%d",&n,&m)){

cnt=0;

int u,v,w;

for(int i=0;i<m;i++){

scanf("%d%d%d",&u,&v,&w);

addedge(u,v,w);

}

int s,t;

scanf("%d%d",&s,&t);

printf("%d\n",Bellman_Ford(s,t));

}

return 0;

}

在网上搜索得到的,觉得写得挺好,自己也总结不了那么全,就先转载过来!

原文链接:http://www.cnblogs.com/jackge/archive/2013/01/01/2841536.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382030.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

训练指南——数学专题一的总结

差不多一个星期过去了&#xff0c;在这一个多星期里&#xff0c;我做了一个数学专题和两场训练赛&#xff0c;要说对自己的感觉&#xff0c;只能说很差劲&#xff0c;开始的时候以为环境会比现在宽松很多&#xff0c;后来才发现想法是错误的&#xff0c;实验室室里室一种紧张的…

micro/protoc-gen-micro 不见了

别挣扎了&#xff0c;这个项目被官方删了。换别的用吧 别挣扎了&#xff0c;这个项目被官方删了。换别的用吧 别挣扎了&#xff0c;这个项目被官方删了。换别的用吧 别挣扎了&#xff0c;这个项目被官方删了。换别的用吧

关于第二次训练赛

第二次训练赛甚至比第一次还要差&#xff0c;开始做的时候&#xff0c;因为在调并查集的题目&#xff0c;一时忘了比赛开始时间&#xff0c;这又导致了在开始便就输在了起跑线上&#xff0c;接下来看A&#xff0c;20分钟后想到了BFS&#xff0c;不过和p商量后&#xff0c;发现他…

一步获取LeetCode的cookies

登录LeetCode 获取登陆的cookies 浏览器F12。console输入 javascript:document.cookie 打完收工 字数不够csdn不发布 字数不够csdn不发布 字数不够csdn不发布 字数不够csdn不发布 字数不够csdn不发布 字数不够csdn不发布 字数不够csdn不发布 字数不够csdn不发布

HDU2066:一个人的旅行

Problem Description虽然草儿是个路痴&#xff08;就是在杭电待了一年多&#xff0c;居然还会在校园里迷路的人&#xff0c;汗~),但是草儿仍然很喜欢旅行&#xff0c;因为在旅途中 会遇见很多人&#xff08;白马王子&#xff0c;^0^&#xff09;&#xff0c;很多事&#xff0c;…

win11 vmware 安装Ubuntu 连接xshell

安装 open ssh&#xff1a; sudo apt-get install openssh-server 修改root密码 #sudo passwd root 辑配置文件&#xff0c;允许以 root 用户通过 ssh 登录&#xff1a; sudo vi /etc/ssh/sshd_config 找到&#xff1a;PermitRootLogin prohibit-password禁用 添加&…

链表面试大全

链表面试 血与泪的教训是&#xff0c;必须要全部手写&#xff0c;而且要熟练。 面试的时间本来就短&#xff0c;到~到 到时 ~ 到时候 一 一 一张紧&#xff0c;就更做不出来了 第一题 链表相加 2. 两数相加 141. 环形链表 golang 160. 相交链表 206. 反转链表 237. 删除链表中…

送东阳马生序

余幼时即嗜学。家贫&#xff0c;无从致书以观&#xff0c;每假借于藏书之家&#xff0c;手自笔录&#xff0c;计日以还。天大寒&#xff0c;砚冰坚&#xff0c;手指不可屈伸&#xff0c;弗之怠。录毕&#xff0c;走送之&#xff0c;不敢稍逾约。以是人多以书假余&#xff0c;余…

hdu 2112 ——HDU Today

Problem Description 经过锦囊相助&#xff0c;海东集团终于度过了危机&#xff0c;从此&#xff0c;HDU的发展就一直顺风顺水&#xff0c;到了2050年&#xff0c;集团已经相当规模了&#xff0c;据说进入了钱江肉丝经济开发区500强。这时候&#xff0c;XHD夫妇也退居了二线&am…

vim如何自动补全,ycm配置

vimplus已经很完善了&#xff0c;现在安装已经很容易了。 git clone https://github.com/chxuan/vimplus.git ~/.vimplus cd ~/.vimplus ./install.sh Ubuntu配置vim 更新2018年11月8号 用了一段时间的Ubuntu 18简直太方便了。 三步操作全部配完&#xff01;&#xff01;&a…

快速幂取模算法模板

在Miller Rabbin测试素数&#xff0c;就用到了快速幂取模的思想。这里总结下。求a^b%c&#xff08;这就是著名的RSA公钥的加密方法&#xff09;&#xff0c;当a,b很大时&#xff0c;直接求解这个问题不太可能 算法1&#xff1a;利用公式a*b%c((a%c)*b)%c,这样每一步都进行这种处…

学脚本的忠告——我觉得语言大多这样了

1.不要看到别人的回复第一句话就说&#xff1a;给个代码吧&#xff01;你应该想想为什么。当你自己想 出来再参考别人的提示&#xff0c;你就知道自己和别人思路的差异。2.初学者请不要看太多太多的书那会误人子弟的&#xff0c;先找本系统的学&#xff0c;很多人用了很久 都是…

hdu 1317——XYZZY

http://blog.csdn.net/dongshimou/article/details/35984917

UVA10843——Anne\'s game

Lily: “Chantarelle was part of my exotic phase.” Buffy: “It’s nice. It’s a mushroom.” Lily: “It is? That’s really embarrassing.” Buffy: “Well, it’s an exotic mushroom, if that’s any comfort.” Joss Whedon, "Anne". A little girl whose…

在kali Linux中搭建DVWA

1、 由于所发教程前几步没有实现&#xff0c;故直接打开浏览器输入localhost/1.php&#xff0c;打开后即为所要页面 2、用cd /var/www/html 命令进入apache web目录 3、用wget https&#xff1a;//github.com/ethicalhack3r/DVWA/archive/master.zip (注意&#xff1a;ethic…

数组名与函数的结合使用注意项

数组名即数组的首地址&#xff0c;故数组名属于指针变量&#xff0c;在定义函数使数组名作为形参时&#xff0c;要把对应的参数定义为指针变量。因为数组没有特定的使其读入停止的标志&#xff0c;因此还要有确定数组长度的参数&#xff0c;即用户自己输入数组长度。 代码如下…

uva 10883——Supermean

Do you know how to compute the mean (or average) of n numbers? Well, thats not good enough for me. I want the supermean! "Whats a supermean," you ask? Ill tell you. List the n given numbers in non-decreasing order. Now compute the average of ea…

-又见GCD -- ACM解决方法

有三个正整数a,b,c(0<a,b,c<10^6)&#xff0c;其中c不等于b。若a和c的最大公约数为b&#xff0c;现已知a和b&#xff0c;求满足条件的最小的c。 Input 第一行输入一个n&#xff0c;表示有n组测试数据&#xff0c;接下来的n行&#xff0c;每行输入两个正整数a,b。 Ou…

Cake -- ACM解决方法

一次生日Party可能有p人或者q人参加,现准备有一个大蛋糕.问最少要将蛋糕切成多少块(每块大小不一定相等),才能使p人或者q人出席的任何一种情况,都能平均将蛋糕分食. Input 每行有两个数p和q. Output 输出最少要将蛋糕切成多少块. Sample Input 2 3 Sample Output 4 …

vi 的 使用

vi &#xff08;Linux下的文本编辑器&#xff09; a 在光标后添加文本A 在本行行末添加文本i 在光标前插入文本I 在本行开始插入文本o 在光标下插入新行O 在光标上插入新行dd 删除光标所在行 &#xff08;2dd即删除此下的两行&#xff0c;3dd以此类推&#xff09;p 粘贴&#…