</pre><pre name="code" class="cpp"><pre name="code" class="cpp">//题意:题目意思不解释了,解释了这道题就没意思,感觉不会写代码,把题目理解,也是很有帮助的 //思路:对于这钟点比较少的最短路,第一思路就是暴力,floyd。 #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> using namespace std; #define maxf 105 #define maxn 505 #define inf 0x3f3f3f3f int firenum, n; int fire[maxf]; int map[maxn][maxn]; int firedist[maxn]; void slove() { for (int i = 0; i < n; i++) firedist[i] = inf; for (int i = 0; i < n; i++)//着火点 for (int j = 0; j < firenum; j++)//消防站 firedist[i] = min(firedist[i], map[i][fire[j]]);//着火点到消防站的最小距离 int ans, maxdist = inf; for (int i = 0; i < n; i++)//假设i点有消防站 { int temp = 0; for (int j = 0; j < n; j++) temp = max(temp, min(firedist[j], map[i][j]));//着火点到消防站最大距离的变化 if (temp < maxdist) { ans = i; maxdist = temp; } } printf("%d\n", ans + 1); } int main() { scanf("%d%d", &firenum, &n); for (int i = 0; i < firenum; i++) { scanf("%d", &fire[i]); fire[i]--; } for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) if (i != j) map[i][j] = inf; else map[i][j] = 0; int a, b, c; while (~scanf("%d%d%d", &a, &b, &c)) { a--; b--; map[a][b] = map[b][a] = min(map[a][b], c); } for (int k = 0; k < n; k++) for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) map[i][j] = min(map[i][j], map[i][k] + map[k][j]); slove(); return 0; }