题目:
奶牛们分别从n个农场前往x地开派对,有m条路线把n个农场相连,路是单向的。
奶牛们从所在的地方用最短路径走到x,再用最短的路径走回来。求出路径最长的奶牛要花费多长时间。
第一行输入n,m,x。随后的m+1行输入a,b,t。从a地到b地花费时间t。
思路:
确定了x点,单源最短路问题。首先用dijkstra算法,把x点到其他所有点的最短距离存储在数组中。然后把所有的路反转一下,再用dijkstra算法,把x点到其他所有点的最短距离存储在数组中,此时这个数组代表的是其他点到x点的最短距离。再加一下,找到最大的,结束。
AC情况:
代码:
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 1005
#define INF 0x3f3f3f3f
int i, j;
int map[maxn][maxn], n;
int d[maxn], d2[maxn];
void dijkstra(int x) {
int visit[maxn],i,j,min,next=x;
memset(visit, 0, sizeof(visit));
for (i = 1; i <= n; i++)
d[i] = map[x][i];
visit[x] = 1;
for (i = 2; i <= n; i++) {
min = INF;
for (j = 1; j <= n; j++) {
if (!visit[j] && d[j] < min) {
min = d[j];
next = j;
}
}
visit[next] = 1;
for (j = 1; j <= n; j++) {
if (!visit[j] && d[j] > d[next] + map[next][j])
d[j] = d[next] + map[next][j];
}
}
}
int main() {
int m, x;
int a, b, t;
scanf_s("%d%d%d", &n, &m, &x);
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
if (i == j) map[i][j] = 0;
else map[i][j] = INF;
}
}
while (m--) {
scanf_s("%d%d%d", &a, &b, &t);
map[a][b] = t;
}
dijkstra(x);
for (i = 1; i <= n; i++)
d2[i] = d[i]; //d2[i]表示x到点i的最短路
for (i = 1; i <= n; i++) {
for (j = i + 1; j <= n; j++) {
int t;
t = map[j][i];
map[j][i] = map[i][j];
map[i][j] = t;
}
}
dijkstra(x); //此时 d[i]表示点i到x的最短路
int ans = 0;
for (i = 1; i <= n; i++)
if (i != x) ans = max(ans, d2[i] + d[i]);
printf("%d\n", ans);
return 0;
}