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. VC++ LoadLibrary失败,错误126(找不到指定的模块)

    在VS中调用一个资源模块dll,LoadLibrary返回值为NULL,没有加载成功.GetLastError后原因为"找不到指定的模块"!代码如下: HINSTANCE hIns ...

  2. php正则表达式、数组

    <?php $s = "he8llo5wor6ld"; $s = preg_replace("/\d/","#",$s);按照正则表达 ...

  3. Hibernate双向一对多对象关系模型映射

    双向one-to-many 描述部门和岗位:一个部门有多个岗位 将单向的one-to-many 和many-to-one合并. 4.1双向的one-to-many数据库模型 create table ...

  4. linux crontab 学习

    安装crontab:[root@CentOS ~]# yum install vixie-cron[root@CentOS ~]# yum install crontabs/sbin/service ...

  5. 模拟赛1030d1

    [问题描述]从1− ?中找一些数乘起来使得答案是一个完全平方数,求这个完全平方数最大可能是多少.[输入格式]第一行一个数字?.[输出格式]一行一个整数代表答案对100000007取模之后的答案.[样例 ...

  6. Makefile_:=与=的区别

    1."=" make会将整个makefile展开后,再决定变量的值.也就是说,变量的值将会是整个makefile中最后被指定的值.看例子: x = foo            y ...

  7. Retrofit学习入门

    Retrofit的使用 设置权限与添加依赖 定义请求接口 通过创建一个retrofit生成一个接口的实现类(动态代理) 调用接口请求数据 设置权限与添加依赖 权限:首先确保在AndroidManife ...

  8. hdu 2159 FATE

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2159 思路:二维完全背包,状态转移方程为: f[j][l]=max(f[j][l],f[j-b[i]] ...

  9. 关于plsql连接oracle数据库session失效时间设置

    http://bbs.csdn.net/topics/350152441 http://www.linuxidc.com/Linux/2015-09/123286.htm

  10. C#的yield关键字

    using System; using System.Collections.Generic; using System.Reflection; using System.Text.RegularEx ...