题目:
样例输入
4
5
1
1 2 3
1 3 4
1 4 5
2 3 8
3 4 2
样例输出
4
样例说明
下图是样例说明。
思路:不需要管root,考试的时候管了,喜提0分。就是选n-1条权值最小的边使得n个点联通就行,最大的边不管在第几层都会成为最后的答案,与root无关。
提交后100分的代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
int r[maxn],p[maxn];
int u[maxn],v[maxn],w[maxn];
bool cmp(int a,int b) {
return w[a] < w[b];
}
int mfind(int u) {
return (p[u] == u ? u : (p[u] = mfind(p[u])));
}
int main() {
int n,m;
ios::sync_with_stdio(0);
cin >> n >> m;
int root;
cin >> root;
for(int i = 1; i <= n; i++)p[i] = i;
for(int i = 0; i < m; i++)r[i] = i;
for(int i = 0; i < m; i++) {
cin >> u[i] >> v[i] >> w[i];
}
sort(r,r+m,cmp);
int ans = 0;
for(int i = 0; i < m; i++) {
int x = mfind(u[r[i]]),y = mfind(v[r[i]]);
if(x != y) {
p[x] = y;
ans = max(ans,w[r[i]]);
}
}
cout << ans <<"\n";
return 0;
}