Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 20726 | Accepted: 9487 |
Description
One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the big cow party to be held at farm #X (1 ≤ X ≤ N). A total of M (1 ≤ M ≤ 100,000) unidirectional (one-way roads connects pairs of farms; road i requires Ti (1 ≤ Ti ≤ 100) units of time to traverse.
Each cow must walk to the party and, when the party is over, return to her farm. Each cow is lazy and thus picks an optimal route with the shortest time. A cow's return route might be different from her original route to the party since roads are one-way.
Of all the cows, what is the longest amount of time a cow must spend walking to the party and back?
Input
Lines 2..M+1: Line i+1 describes road i with three space-separated integers: Ai, Bi, and Ti. The described road runs from farm Ai to farm Bi, requiring Ti time units to traverse.
Output
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
Hint
Cow 4 proceeds directly to the party (3 units) and returns via farms 1 and 3 (7 units), for a total of 10 time units.
题意大概:所有的牛要去某一个地方参加聚会,每只牛从自己家出发去参加聚会,然后再回来,去的路是单向路,只能走一遍,问所有的牛来回一遍的最小时间中的最大值。
这个题为有向图,当每只牛参加完聚会,回来时相当于从某一固定点到各点之间的最小距离,用迪杰斯特拉求解,然而去的时候,要求每个点到固定点之间的最小距离,这个有向图我们用邻接矩阵存储,第一遍迪杰斯特拉我们算出,从聚会点回家的最短路径,这时把邻接矩阵逆置一下,map[i][j] 原来表示从i到j之间的距离,逆置之后,表示j到i之间的距离,这时再用迪杰斯特拉求一遍,求出的相当于从各起点到终点之间的距离。
#include<stdio.h>
#define INF 1<<30
int temp[2001][2001], distance1[1001], distance2[1001];
void get_distance(int n, int x, int distance[]) {
int i, min, flag, j, visted[2001] = {0};
for(i = 1; i <= n; i++)
distance[i] = temp[x][i];
visted[x] = 1;
distance[x] = 0;
for(i = 1; i < n; i++) {
min = INF;
for(j = 1; j <= n; j++)
if(min > distance[j] && !visted[j]) {
min = distance[j];
flag = j;
}
visted[flag] = 1;
for(j = 1; j <= n; j++) {
if(distance[j] > min + temp[flag][j] && !visted[j])
distance[j] = min + temp[flag][j];
}
}
}
void Inverse(int t) {
int temp1, i, j;
for(i = 1; i <= t; i++)
for(j = 1; j <= i; j++) {
temp1 = temp[i][j];
temp[i][j] = temp[j][i];
temp[j][i] = temp1;
}
}
int main() {
int t, n, i, k, m, dis, max = -1, x, j;
while(scanf("%d%d%d", &t, &n, &x) != EOF) {
for(i = 1; i <=2000; i++)
for(k = 1; k <= 2000; k++)
temp[i][k] = INF;
for(i = 1; i <= n; i++) {
scanf("%d%d%d", &k, &m, &dis);
if(dis<temp[k][m])
{
temp[k][m] = dis;
}
}
get_distance(t, x, distance1);
Inverse(t);
get_distance(t, x, distance2);
for(i = 1; i <= t; i++) {
distance1[i] = distance1[i] + distance2[i];
if(distance1[i] > max)
max = distance1[i];
}
printf("%d\n", max);
}
}