老样子,不多说上代码。
。。。。
#include <stdio.h>
#include <algorithm>
using namespace std;
const int maxn = 1e5+5;
int f[maxn], h[maxn], n, m, x, y, c;
//用结构体储存数据
struct node {
int x, y, c;
} a[maxn];
bool cmp(node a, node b) {
return a.c > b.c;
//以矛盾值作为判断依据,为下面的排序做准备
}
void Init() {
for(int i=1; i<=2*n; i++) {
f[i] = i;
h[i] = 0;
}
}
int Find(int i) {
return f[i]==i ? f[i] : f[i]=Find(f[i]);
}
void merge(int a, int b) {
int fa = Find(a);
int fb = Find(b);
if(fa != fb) {
if(h[fa] < h[fb]) {
f[fa] = fb;
} else {
f[fb] = fa;
if(h[fa]==h[fb]) h[fa]++;
}
}
}
int main(void) {
scanf("%d %d", &n, &m);
Init(); //初始化
for(int i=1; i<=m; i++)
scanf("%d %d %d", &a[i].x, &a[i].y, &a[i].c);
sort(a+1, a+1+m, cmp); //将数据按照矛盾值从大到小排序
for(int i=1; i<=m; i++) {
int x = a[i].x;
int y = a[i].y;
if(Find(x) == Find(y)) {
//如果 x和 y在同一座监狱,证明无法再继续优化分配了
//因为前面矛盾值大的都已经优化分配了
//那么此时这对的矛盾值就是 Z市长看到的最大矛盾值
//直接输出并结束
printf("%d\n", a[i].c);
return 0;
}
//敌人的敌人是朋友
merge(x, y+n);
merge(y, x+n);
}
printf("0\n"); //特殊情况:没有任何冲突事件
return 0;
}