您的位置:首页 > Web前端

【USACO 2007 February Silver】农场派对

2015-08-28 18:26 375 查看
Description

  N(1<=N<=1000)头牛要去参加一场在编号为x(1<=x<=N)的牛的农场举行的派对。有M(1<=M<=100000)条有向道路,每条路长Ti(1<=Ti<=100);每头牛都必须参加完派对后回到家,每头牛都会选择最短路径。求这N头牛的最短路径(一个来回)中最长的一条的长度。 特别提醒:可能有权值不同的重边。

Input

  第1行:3个空格分开的整数N, M, X

  第2..M+1行:3个空格分开的整数Ai, Bi, Ti,表示有一条从Ai到Bi的路,长度为Ti

Output

  第1行:最长最短路的长度

Sample Input

4 8 2

1 2 4

1 3 2

1 4 7

2 1 1

2 3 5

3 1 2

3 4 4

4 2 3

Sample Output

10

这么赤裸裸的最短路居然改了好长时间

有一点需要注意

就是关于如何求任意点到源点s的最短路

将邻接矩阵转置再跑dijkstra就ok了

代码冗长表介意

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define INF 100000000;
using namespace std;
int g[1001][1001],dis1[1001],dis2[1001],n,m,x,maxn=-1;
void dijkstra(int dis[])
{
int i,j,v,min;
int visit[1005];
memset(visit,0,sizeof(visit));
for(i=1;i<=n;i++)
dis[i]=g[x][i];
dis[x]=0;
visit[x]=1;
for(i=1;i<=n;i++)
{
min=INF;
for(j=1;j<=n;j++)
{
if(!visit[j]&&dis[j]<min)
{
min=dis[j];
v=j;
}
}
visit[v]=1;
for(j=1;j<=n;j++)
if(!visit[j]&&dis[v]+g[v][j]<dis[j])
dis[j]=dis[v]+g[v][j];
}
}
void tran()
{
int i,j,temp;
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
{
temp=g[i][j];
g[i][j]=g[j][i];
g[j][i]=temp;
}
}
int main()
{
int i,j,a,b,t;
cin>>n>>m>>x;
memset(g,127/3,sizeof(g));
for(i=1;i<=m;i++)
{
cin>>a>>b>>t;
if(g[a][b]>t) g[a][b]=t;
}
dijkstra(dis1);
tran();
dijkstra(dis2);
for(i=1;i<=n;i++)
if(i!=x && dis1[i]+dis2[i]>maxn) maxn=dis1[i]+dis2[i];
cout<<maxn;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: