B. Fire-Fighting Hero(The 2019 Asia Nanchang First Round Online Programming Contest)
样例输入
1
4 7 3 2 2
1 4
1 2 7
1 3 2
1 4 6
2 1 1
2 4 1
3 2 1
3 4 3
样例输出
2
AC代码
#include <iostream>
#include <cstdio>
using namespace std;
int city[1010][1010];
const int inf = 1<<29;
int main(){
int t;
scanf("%d", &t);
while(t--){
int n, m, x, k, c, themin = inf, max1 = 0, max2 = 0;
scanf("%d%d%d%d%d", &n, &m, &x, &k, &c);
for (int i = 1; i <= n; i++){
for (int j = 1; j <= n; j++){
if (i == j) city[i][j] = 0;
else city[i][j] = inf;
}
}
//消防队位置
int team[1010];
for (int i = 1; i <= k; i++)
scanf("%d", &team[i]);
int t1, t2, t3;
//城市道路信息
for (int i = 1; i <= m; i++){
scanf("%d%d%d", &t1, &t2, &t3);
if (t3 < city[t1][t2]){
city[t1][t2] = t3;
city[t2][t1] = t3;
}
}
for (int r = 1; r <= n; r++)
for (int p = 1; p <= n; p++)
for (int q = 1; q <= n; q++)
if (city[p][r] + city[r][q] < city[p][q])
city[p][q] = city[p][r] + city[r][q];
max2 = max1 = 0;
for (int i = 1; i <= n; i++){
if (city[x][i] > max2 && city[x][i] != inf)
max2 = city[x][i];
themin = inf;
for (int j = 1; j <= k; j++)
themin = min(city[team[j]][i], themin);
if (themin != inf)
max1 = max(themin, max1);
}
if (max2*1.0/c <= max1) printf("%d\n", max2);
else printf("%d\n", max1);
}
return 0;
}