176. [USACO Feb07] 奶牛聚会
★☆ 输入文件:sparty.in
输出文件:
sparty.out
简单对比
时间限制:3 s 内存限制:16 MB
- 第1行:三个用空格隔开的整数.
- 唯一一行:一个整数: 所有参加聚会的奶牛中,需要花费总时间的最大值.
译: zqzas
N(1 ≤ N ≤ 1000)个农场中的每个农场都有一只奶牛去参加位于第X个农场的聚会.共有M (1 ≤ M ≤ 100,000)条单向的道路,每条道路连接一对农场.通过道路i会花费Ti (1 ≤ Ti ≤ 100)的时间.
作为参加聚会的奶牛必须走到聚会的所在地(农场X).当聚会结束时,还要返回各自的农场.奶牛都是很懒的,她们想找出花费时间最少的路线.由于道路都是单向的,所有她们前往农场X的路线可能会不同于返程的路线.
Of all the cows, what is the longest amount of time a cow must spend walking to the party and back? 对于所有参加聚会的奶牛,找出前往聚会和返程花费总时间最多的奶牛,输出这只奶牛花费的总时间.
输入格式:
第2行到第M+1行,每行三个用空格隔开的整数:Ai, Bi,以及Ti.表示一条道路的起点,终点和需要花费的时间.
输出格式:
样例输出:
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
样例输入:
10
样例说明:
共有4只奶牛参加聚会,有8条路,聚会位于第2个农场.
第4只奶牛可以直接到聚会所在地(花费3时间),然后返程路线经过第1和第3个农场(花费7时间),总共10时间.
水Flyod
#include <iostream>
#include <cstdio>
#define INF 999999999
#define MAX_N 1000
using namespace std;
int N,M,D;
int d[MAX_N][MAX_N];
int main()
{
freopen("sparty.in","r",stdin);
freopen("sparty.out","w",stdout);
scanf("%d%d%d",&N,&M,&D);
D--;
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
d[i][j]=INF;
}
d[i][i]=0;
}
for(int i=0;i<M;i++)
{
int a,b,v;
scanf("%d%d%d",&a,&b,&v);
a--;
b--;
d[a][b]=min(d[a][b],v);
}
for(int k=0;k<N;k++)
{
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
d[i][j]=min(d[i][k]+d[k][j],d[i][j]);
}
}
}
int maxt=0;
for(int i=0;i<N;i++)
{
maxt=max(maxt,d[i][D]+d[D][i]);
}
printf("%d\n",maxt);
return 0;
}