HDU 2544 最短路【dijkstra+floyd+spfa+bellman-ford】

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
 
dijkstra:
View Code
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define M 110
struct node
{
int u,v,w;
}edge[M*M];
int n,m,a[M][M];
int dijkstra()
{
int f[M],d[M],x=1,i;
for(i=2;i<=n;i++)
f[i]=d[i]=-1;
d[1]=0;
while(x)
{
f[x]=0;
for(i=1;i<=n;i++)
if(a[x][i]>=0&&(a[x][i]+d[x]<d[i]||d[i]<0))
d[i]=a[x][i]+d[x];
x=0;
for(i=1;i<=n;i++)
if(f[i]&&d[i]>=0&&(!x||d[i]<d[x]))
x=i;
}
return d[n];
}
int main()
{
int x,i,j,w,k=0,ans;
while(scanf("%d%d",&n,&m),n||m){
for(i=1;i<=n;i++){
for(j=1;j<=n;j++)
a[i][j]=-1;
a[i][i]=0;
}
for(x=0;x<m;x++){
scanf("%d%d%d",&i,&j,&w);
edge[x].u=i;
edge[x].v=j;
edge[x].w=w;
if(a[i][j]<0||a[i][j]>w)
a[i][j]=a[j][i]=w;
}
printf("%d\n",dijkstra());
}
return 0;
}

floyd:
 
View Code
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define M 110
struct node
{
int u,v,w;
}edge[M*M];
int n,m,a[M][M];
int floyd()
{
int i,j,k;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
if(a[i][k]>=0)
for(j=1;j<=n;j++)
if(a[k][j]>=0&&(a[i][k]+a[k][j]<a[i][j]||a[i][j]<0))
a[i][j]=a[i][k]+a[k][j];
return a[1][n];
}
int main()
{
int x,i,j,w,k=0,ans;
while(scanf("%d%d",&n,&m),n||m){
for(i=1;i<=n;i++){
for(j=1;j<=n;j++)
a[i][j]=-1;
a[i][i]=0;
}
for(x=0;x<m;x++){
scanf("%d%d%d",&i,&j,&w);
edge[x].u=i;
edge[x].v=j;
edge[x].w=w;
if(a[i][j]<0||a[i][j]>w)
a[i][j]=a[j][i]=w;
}
printf("%d\n",floyd());
}
return 0;
}
spfa:
View Code
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define M 110
struct node
{
int u,v,w;
}edge[M*M];
int n,m,a[M][M];
int spfa()
{
int q[M],head=0,tail=1,i,x,d[M],f[M];
for(i=2;i<=n;i++)
f[i]=d[i]=-1;
d[1]=0;
q[0]=1;
f[1]=0;
while(head!=tail){
x=q[head++];
f[x]=-1;
head%=n+1;
for(i=1;i<=n;i++)
if(a[x][i]>=0&&(a[x][i]+d[x]<d[i]||d[i]<0)){
d[i]=a[x][i]+d[x];
if(f[i]){
f[i]=0;
q[tail++]=i;
tail%=n+1;
}
}
}
return d[n];
}
int main()
{
int x,i,j,w,k=0,ans;
while(scanf("%d%d",&n,&m),n||m){
for(i=1;i<=n;i++){
for(j=1;j<=n;j++)
a[i][j]=-1;
a[i][i]=0;
}
for(x=0;x<m;x++){
scanf("%d%d%d",&i,&j,&w);
edge[x].u=i;
edge[x].v=j;
edge[x].w=w;
if(a[i][j]<0||a[i][j]>w)
a[i][j]=a[j][i]=w;
}
printf("%d\n",spfa());
}
return 0;
}
bellman-ford:
View Code
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define M 110
struct node
{
int u,v,w;
}edge[M*M];
int n,m,a[M][M];
int bellman_ford()
{
int i,j,d[M];
for(i=1;i<=n;i++)
d[i]=-1;
d[1]=0;
for(i=1;i<n;i++)
for(j=0;j<m;j++){
if(d[edge[j].u]>=0&&(d[edge[j].u]+edge[j].w<d[edge[j].v]||d[edge[j].v]<0))
d[edge[j].v]=d[edge[j].u]+edge[j].w;
if(d[edge[j].v]>=0&&(d[edge[j].v]+edge[j].w<d[edge[j].u]||d[edge[j].u]<0))
d[edge[j].u]=d[edge[j].v]+edge[j].w;
}
return d[n];
}
int main()
{
int x,i,j,w,k=0,ans;
while(scanf("%d%d",&n,&m),n||m){
for(i=1;i<=n;i++){
for(j=1;j<=n;j++)
a[i][j]=-1;
a[i][i]=0;
}
for(x=0;x<m;x++){
scanf("%d%d%d",&i,&j,&w);
edge[x].u=i;
edge[x].v=j;
edge[x].w=w;
if(a[i][j]<0||a[i][j]>w)
a[i][j]=a[j][i]=w;
}
printf("%d\n",bellman_ford());
}
return 0;
}

posted @ 2012-03-16 00:33  'wind  阅读(180)  评论(0编辑  收藏  举报