题目大意:求最小生成树最大边。
分析:水题。在模板里加一个ans记录加入的边即可。
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 10010;
struct Edge{
int s, e, w;
bool operator < (const Edge & e1) const {
return w < e1.w;
}
}e[maxn];
int f[2010], n, m;
long long ans;
int getfather(int x) {
if(f[x] == x) return x;
else return f[x] = getfather(f[x]);
}
int kruscal() {
sort(e+1, e+m+1);
int cnt = n;
ans = 0;
for(int i = 1; i <= n; i++) f[i] = i;
for(int i = 1; i <= m; i++) {
int f1 = getfather(e[i].s);
int f2 = getfather(e[i].e);
if(f1 != f2) {
f[f1] = f2;
if(ans < e[i].w)
ans = e[i].w;
cnt--;
}
}
if(cnt == 1) return true; //cnt代表;联通块的个数
else return false;
}
int main() {
while(~scanf("%d%d", &n, &m)) {
for(int i = 1; i <= m; i++)
scanf("%d%d%d", &e[i].s, &e[i].e, &e[i].w);
if(kruscal())
printf("%lld\n", ans);
else printf("-1\n");
}
return 0;
}