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 最短路径 四种方法的更多相关文章

  1. 用MATLAB结合四种方法搜寻罗马尼亚度假问题

    选修了cs的AI课,开始有点不适应,只能用matlab硬着头皮上了,不过matlab代码全网仅此一份,倒有点小自豪. 一.练习题目 分别用宽度优先.深度优先.贪婪算法和 A*算法求解"罗马利 ...

  2. 两个变量交换的四种方法(Java)

    对于两种变量的交换,我发现四种方法,下面我用Java来演示一下. 1.利用第三个变量交换数值,简单的方法. (代码演示一下) class TestEV //创建一个类 { public static ...

  3. 织梦DedeCMS模板防盗的四种方法

    织梦(DedeCMS)模板也是一种财富,不想自己辛辛苦苦做的模板被盗用,在互联网上出现一些和自己一模一样的网站,就需要做好模板防盗.本文是No牛收集整理自网络,不过网上的版本都没有提供 Nginx 3 ...

  4. 让一个图片在div中居中(四种方法)

    第一种方法: <div class="title"> <div class="flag"></div> <div cl ...

  5. 运行jar应用程序引用其他jar包的四种方法

    转载地址:http://www.iteye.com/topic/332580 大家都知道一个java应用项目可以打包成一个jar,当然你必须指定一个拥有main函数的main class作为你这个ja ...

  6. java中定时器的四种方法

    package com.lid; import java.util.Calendar; import java.util.Date; import java.util.Timer; import ja ...

  7. Angular--页面间切换及传值的四种方法

    1. 基于ui-router的页面跳转传参(1) 在AngularJS的app.js中用ui-router定义路由,比如现在有两个页面,一个页面(producers.html)放置了多个produce ...

  8. MYSQL获取自增ID的四种方法

    MYSQL获取自增ID的四种方法 1. select max(id) from tablename 2.SELECT LAST_INSERT_ID() 函数 LAST_INSERT_ID 是与tabl ...

  9. linux下配置ip地址四种方法(图文方法)

    主要是用第四种方法 (1)Ifconfig命令  第一种使用ifconfig命令配置网卡的ip地址.此命令通常用来零时的测试用,计算机启动后 ip地址的配置将自动失效.具体用法如下.Ipconfig  ...

随机推荐

  1. Divide and conquer:Dropping tests(POJ 2976)

    最大化平均值 题目大意:给定你n个分数,从中找出k个数,使∑a/∑b的最大值 这一题同样的也可以用二分法来做(用DP会超时,可见二分法是多么的实用呵!),大体上是这样子:假设最大的平均值是w,那么题目 ...

  2. IsNullOrEmpty与IsNullOrWhiteSpace区别

    IsNullOrEmpty public static bool IsNullOrEmpty(String value) { return (value == null || value.Length ...

  3. 【leetcode】Balanced Binary Tree(middle)

    Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...

  4. 【编程题目】有 n 个长为 m+1 的字符串,如果某个字符串的最后 m 个字符与某个字符串的前 m 个字符匹配...

    37.(字符串)有 n 个长为 m+1 的字符串,如果某个字符串的最后 m 个字符与某个字符串的前 m 个字符匹配,则两个字符串可以联接,问这 n 个字符串最多可以连成一个多长的字符串,如果出现循环, ...

  5. 【python】编码

    来源:廖雪峰 看到一篇很不错的讲python编码的文章,转过来 划重点: unicode是一种统一的编码方式,它将所有的编码方式都统一到了同一套规范中,避免了乱码问题. encode() 表示从 un ...

  6. 51nod 1065 最小正子段和 (贪心)

    题目:传送门. 题意:中文题. 题解:求前缀和,并且标记每个数的下标,按照前缀和大小进行从小到大排序.随后进行遍历,如果满足下标data[i-1].id<data[i].id&& ...

  7. php命令行运行出现错误Call to undefined function curl_init()

    在windows命令行窗口下运行php命令,需要将php.exe所在的路径添加到Path环境变量,例如C:\wamp\bin\php\php5.4.3 启动Apache服务 在命令行中输入php te ...

  8. javascript测试

    s阿道夫. 撒旦法 sd sad sd 的萨法a dsa发 fds sdfad 电风扇爱的方式爱的方式啊

  9. UVa1592_数据库

    #include<iostream> #include<cstdio> #include<vector> #include<utility> #incl ...

  10. 项目之solr全文搜索工具的安装

    1. Solr简介 Solr是一个基于Lucene的Java搜索引擎服务器.Solr 提供了层面搜索.命中醒目显示并且支持多种输出格式(包括 XML/XSLT 和 JSON 格式).它易于安装和配置, ...