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 ...
随机推荐
- Divide and conquer:Dropping tests(POJ 2976)
最大化平均值 题目大意:给定你n个分数,从中找出k个数,使∑a/∑b的最大值 这一题同样的也可以用二分法来做(用DP会超时,可见二分法是多么的实用呵!),大体上是这样子:假设最大的平均值是w,那么题目 ...
- IsNullOrEmpty与IsNullOrWhiteSpace区别
IsNullOrEmpty public static bool IsNullOrEmpty(String value) { return (value == null || value.Length ...
- 【leetcode】Balanced Binary Tree(middle)
Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...
- 【编程题目】有 n 个长为 m+1 的字符串,如果某个字符串的最后 m 个字符与某个字符串的前 m 个字符匹配...
37.(字符串)有 n 个长为 m+1 的字符串,如果某个字符串的最后 m 个字符与某个字符串的前 m 个字符匹配,则两个字符串可以联接,问这 n 个字符串最多可以连成一个多长的字符串,如果出现循环, ...
- 【python】编码
来源:廖雪峰 看到一篇很不错的讲python编码的文章,转过来 划重点: unicode是一种统一的编码方式,它将所有的编码方式都统一到了同一套规范中,避免了乱码问题. encode() 表示从 un ...
- 51nod 1065 最小正子段和 (贪心)
题目:传送门. 题意:中文题. 题解:求前缀和,并且标记每个数的下标,按照前缀和大小进行从小到大排序.随后进行遍历,如果满足下标data[i-1].id<data[i].id&& ...
- php命令行运行出现错误Call to undefined function curl_init()
在windows命令行窗口下运行php命令,需要将php.exe所在的路径添加到Path环境变量,例如C:\wamp\bin\php\php5.4.3 启动Apache服务 在命令行中输入php te ...
- javascript测试
s阿道夫. 撒旦法 sd sad sd 的萨法a dsa发 fds sdfad 电风扇爱的方式爱的方式啊
- UVa1592_数据库
#include<iostream> #include<cstdio> #include<vector> #include<utility> #incl ...
- 项目之solr全文搜索工具的安装
1. Solr简介 Solr是一个基于Lucene的Java搜索引擎服务器.Solr 提供了层面搜索.命中醒目显示并且支持多种输出格式(包括 XML/XSLT 和 JSON 格式).它易于安装和配置, ...