Hdu2544 最短路径 四种方法
Problem Description
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
Input
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
输入保证至少存在1条商店到赛场的路线。
Output
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
Sample Input
2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0
Sample Output
3
2
最短路 (Bellman-Ford、Dijkstra and Floyd用三种方法写)
Bellman-Ford 求含负权图的单元最短路径(效率低)
//现在还有点不太懂bellman-ford 两重循环,第一层是 点的个数,第二层是边的个数的二倍。Map数组不用初始化
SPFA 用队列写,效率高 (平均入队次数不超过两次)有!
ps: SPFA是bellman-ford的优化,队列写(每个点平均入队次数不超过两次)。为了避免最坏的情况出现,一般用dijkstra,floyd基本不用
1.Floyd:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define mx 1<<29
int mp[][];
int n,m; void floyd()
{
for(int k=; k<=n; k++)
for(int i=; i<=n; i++)
for(int j=; j<=n; j++)
mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
printf("%d\n",mp[][n]);
} int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d%d",&n,&m)== && (m+n))
{
for(int i=; i<=n; i++)
for(int j=; j<=n; j++)
mp[i][j]=mx;
while(m--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
mp[a][b]=c;
mp[b][a]=c;
}
floyd();
}
return ;
}
2.dijkstra
///dijkstra
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define INF 0xfffffff
int mp[][];
int vit[],d[];
int n,m,a,b,c; void dijkstra()
{
memset(vit,,sizeof(vit));
int p,minn;
for(int i=; i<=n; i++)d[i]=mp[][i]; vit[]=;
for(int i=; i<=n; i++)
{
minn=INF;
for(int j=; j<=n; j++)
if(!vit[j] && d[j]<minn)
minn=d[j],p=j; vit[p]=; for(int j=; j<=n; j++)
if(!vit[j] && d[j]>minn+mp[p][j])
d[j]=minn+mp[p][j];
}
printf("%d\n",d[n]);
} int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d%d",&n,&m)== && (m+n))
{
for(int i=; i<=n; i++)
for(int j=; j<=n; j++)
mp[i][j]=INF;
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
mp[a][b]=mp[b][a]=c;
}
dijkstra();
}
return ;
}
3.SPFA:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
#define INF 1<<29
int n,m;
int mp[][];
int v[],d[];
//有时候还要加前驱指针
//记录每个节点进队的次数,如果>n,说明存在负环
//SPFA无法处理带负环的问题
void SPFA()
{
memset(v,,sizeof(v));
for(int i=; i<=n; i++)d[i]=INF;
queue<int>q;
v[]=;
d[]=;
q.push();
while(!q.empty())
{
int x=q.front();
q.pop();
v[x]=;
for(int j=; j<=n; j++) //最好是创建一个邻接表,提高效率
{
if(d[x]+mp[x][j]<d[j])
{
d[j]=d[x]+mp[x][j];
if(!v[j]) q.push(j), v[j]=;
}
}
}
printf("%d\n",d[n]);
return;
} int main()
{
freopen("in.txt","r",stdin);
while(scanf("%d%d",&n,&m)== && (m+n))
{
for(int i=; i<=n; i++)
for(int j=; j<=n; j++)
mp[i][j]=INF;
while(m--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
mp[a][b]=mp[b][a]=c;
}
SPFA();
}
return ;
}
4.bellman_ford:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define INF 1<<29
struct Node
{
int b,e,w;
} v[]; int n,m;
int d[]; int bellman_ford(int b, int e)
{
for(int i=; i<=n; i++) d[i]=INF;
d[b]=; for(int i=; i<n-; i++)
for(int j=; j<m*; j++)
d[v[j].e]=min(d[v[j].e], d[v[j].b]+v[j].w); return d[e];
} int main()
{
//freopen("in.txt","r",stdin);
int a,b,c;
while(scanf("%d%d",&n,&m)== && (m||n))
{
for(int i=; i<m; i++)
{
scanf("%d%d%d", &a,&b,&c);
v[i].b=a;
v[i].e=b;
v[i].w=c;
v[i+m].b=b;
v[i+m].e=a;
v[i+m].w=c;
}
printf("%d\n", bellman_ford(,n));
}
return ;
}
Hdu2544 最短路径 四种方法的更多相关文章
- 用MATLAB结合四种方法搜寻罗马尼亚度假问题
选修了cs的AI课,开始有点不适应,只能用matlab硬着头皮上了,不过matlab代码全网仅此一份,倒有点小自豪. 一.练习题目 分别用宽度优先.深度优先.贪婪算法和 A*算法求解"罗马利 ...
- 两个变量交换的四种方法(Java)
对于两种变量的交换,我发现四种方法,下面我用Java来演示一下. 1.利用第三个变量交换数值,简单的方法. (代码演示一下) class TestEV //创建一个类 { public static ...
- 织梦DedeCMS模板防盗的四种方法
织梦(DedeCMS)模板也是一种财富,不想自己辛辛苦苦做的模板被盗用,在互联网上出现一些和自己一模一样的网站,就需要做好模板防盗.本文是No牛收集整理自网络,不过网上的版本都没有提供 Nginx 3 ...
- 让一个图片在div中居中(四种方法)
第一种方法: <div class="title"> <div class="flag"></div> <div cl ...
- 运行jar应用程序引用其他jar包的四种方法
转载地址:http://www.iteye.com/topic/332580 大家都知道一个java应用项目可以打包成一个jar,当然你必须指定一个拥有main函数的main class作为你这个ja ...
- java中定时器的四种方法
package com.lid; import java.util.Calendar; import java.util.Date; import java.util.Timer; import ja ...
- Angular--页面间切换及传值的四种方法
1. 基于ui-router的页面跳转传参(1) 在AngularJS的app.js中用ui-router定义路由,比如现在有两个页面,一个页面(producers.html)放置了多个produce ...
- MYSQL获取自增ID的四种方法
MYSQL获取自增ID的四种方法 1. select max(id) from tablename 2.SELECT LAST_INSERT_ID() 函数 LAST_INSERT_ID 是与tabl ...
- linux下配置ip地址四种方法(图文方法)
主要是用第四种方法 (1)Ifconfig命令 第一种使用ifconfig命令配置网卡的ip地址.此命令通常用来零时的测试用,计算机启动后 ip地址的配置将自动失效.具体用法如下.Ipconfig ...
随机推荐
- Linux rpm 命令参数使用详解[介绍和应用]
RPM是RedHat Package Manager(RedHat软件包管理工具)类似Windows里面的“添加/删除程序” rpm 执行安装包 二进制包(Binary)以及源代码包(Source)两 ...
- Dynamic Invok Webservice
来源:网络,自己做修改 CSharpCodeProvider csc = new CSharpCodeProvider(); ICodeCompiler icc = csc.CreateCompile ...
- iOS 没有安装对应客户端,不应显示对应的图标
现在很多APP为了让用户更加快捷方便注册,都会使用第三方进行登录,例如QQ/微信/淘宝等.但是上线审核被拒,大致会出现以下内容: Additionally, we found that your ap ...
- IOS - SDWebImage 非ARC 问题
非arc项目中使用SDWebImage类库 1.添加类库引用 (1)ImageIO.framework (2)MapKit.framework 2.在targets->build P ...
- maven编译时如何忽略单元测试
共有两种解决办法 1.通过在命令行设置:-Dmaven.test.skip=true 如:mvn clean install tomcat:run -Dmaven.test.skip=true 2.通 ...
- Windows Form 中快捷键设置
在Windows Form程序中使用带下划线的快捷键只需要进行设置: 就能够工作.
- Myeclipse for Mac快捷键
myeclipse for mac 的快捷键汇总 快键键 作用 备注 Command+1 快速修复(自动导包等) 比如与Syso配合,与main配合可快速构造方法签名 Alt+/ 自动补全 Comma ...
- java.util.ConcurrentModificationException
遍历 List 的时候将 item remove 掉会抛出此异常
- Python 实现发送、抄送邮件功能
发送邮件 问题 在web.py中,如何发送邮件? 解法 在web.py中使用web.sendmail()发送邮件. web.sendmail('cookbook@webpy.org', 'user@e ...
- JS中级 - 03:文档宽高及窗口事件(选)
可视区尺寸 document.documentElement.clientWidth document.documentElement.clientHeight 滚动距离 document.body. ...