百大UP主修仙之旅
题目描述
小明是个优秀的旅游区UP主,他经常穿梭于各种旅游景点来拍视频。有时候路程中时评收益好就赚钱,视频没有收益就自己贴钱。可小明是个精打细算的UP主,他认为视频赔钱的原因是因为自己没有一个良好的根据地,于是经过多次的赔钱尝试,小明绘制出了整个城市旅游景点的地图。
地图上有
n
n
n个城市和
m
m
m条双向边,保证任意两个城市都是可以互相到达的,每条边都有一个路费
c
c
c,一条路径的路费即为组成这条路径的边的路费之和。现在小峰想从这
n
n
n个城市中选出一个作为自己的根据地,既然作为根据地,那肯定要保证到其他景点城市的最少路费的最大值最小。虽然小明精打细算,但是那么多城市肯定是不能手酸出结果的,希望你能用程序计算出最大值最小是多少。
输入
第一行包括两个整数
n
,
m
(
1
≤
n
≤
100
,
n
−
1
≤
m
≤
n
∗
(
n
−
1
)
2
)
n,m(1\le n\le 100,n-1\le m\le \frac {n*(n-1)} 2)
n,m(1≤n≤100,n−1≤m≤2n∗(n−1)) ,代表城市个数
和道路个数。
接下来
m
m
m行每行包括三个整数
u
,
v
,
c
(
1
≤
u
,
v
≤
n
,
1
≤
c
≤
1000
)
u,v,c(1\le u,v\le n,1\le c\le1000)
u,v,c(1≤u,v≤n,1≤c≤1000)表示一条连接
u
u
u号城市和
v
v
v号城市的道路,路费为
c
c
c。
输出
一行一个整数表示最小花费
样例输入
3 3
1 2 100
1 3 2
2 3 1
样例输出
2
提示
将根据地建在3号景点城市,到另外两个城市的路费最大值最小,为1到3的边权为2
AC代码
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn = 1005;
int dis[maxn][maxn];
int n, m;
int main() {
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
if(i == j) dis[i][j] = 0;
else dis[i][j] = INF;
}
}
for(int i = 1; i <= m; i++) {
int u, v, c;
scanf("%d%d%d", &u, &v, &c);
dis[u][v] = dis[v][u] = c;
}
//Floyd算法
for(int k = 1; k <= n; k++) {
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
if(dis[i][k] == INF || dis[k][j] == INF) continue;
dis[i][j] = min(dis[i][j], dis[i][k]+dis[k][j]); //计算最短路径
}
}
}
int res = INF;
for(int i = 1; i <= n; i++) {
int ans = 0;
for(int j = 1; j <= n; j++) {
ans = max(ans, dis[i][j]);
}
res = min(res, ans);
}
printf("%d", res);
return 0;
}
代码分析
本题实质是求图的重心,可以采用 F l o y d Floyd Floyd算法求出图上任意两点之间的距离。最后遍历每个点求出距离此点最远的点的距离,所有的距离求最小值即是答案,复杂度为 O ( n 3 ) O(n^3) O(n3)