题解:P12222 [蓝桥杯 2023 国 Java B] 电动车
Void_Trailwalker · · 题解
分析
首先根据图的基本知识可以知道
简言之:求出一棵最长边最短的树。
算法
这就是瓶颈生成树了。无向图
我们来看一个性质:最小生成树是瓶颈生成树,但瓶颈生成树不一定是最小生成树。
为什么?最小生成树是让这棵树的边权和最小,而瓶颈生成树是让最长边最短。也就是说最小生成树的最长边就是瓶颈生成树的最长边。因为瓶颈生成树的最长边最短,而最小生成树是所有生成树中最小的(边权),所以最长边一定相同。
所以我们可以写最小生成树。
代码
然后就是模板代码了。
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
int x , y , len;
}a[200005];
int n , ans , m , f[200005];
bool cmp(node A , node B){
return A.len < B.len;
}
int find(int x){
if(f[x]==x)return x;
return f[x] = find(f[x]);
}
int main(){
cin >> n >> m;
for(int i=1;i<=m;i++)cin >> a[i].x >> a[i].y >> a[i].len;
for(int i=1;i<=n;i++)f[i] = i;
sort(a+1,a+m+1,cmp);
for(int i=1;i<=m;i++){
if(find(a[i].x)!=find(a[i].y))f[find(a[i].x)] = find(a[i].y) , ans = max(ans,a[i].len) , n--;
}
if(n>1)ans = -1;
cout << ans;
return 0;
}
相信大家都会用并查集吧,如果不会请去 P3367,这里就不多说了。
注意事项:
- 并查集务必赋初始值!不赋后果自负!
- 路径压缩!
- 排序!
- 判断无解!
- 不要抄袭!