看!题面被吃掉了!
https://www.luogu.org/problemnew/show/P1525
淳朴的并查集~但因为它们带有权值,因此排序是必须的,我们要尽可能让危害大的罪犯在两个监狱里。
那么,再结合敌人的敌人和自己在一个监狱的规律合并。
当查找时发现其中两个罪犯不可避免地碰撞到一起时,只能将其输出并结束。
#include <cmath>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int N=40005;
int n,m,uu,vv,tt,fu,fv,f[N],ans;
struct cyq{
int u,v,t;
}a[100005];
bool cmp(cyq aa,cyq bb){
return aa.t>bb.t;
}
int find(int h)
{
if(f[h]==h) return h;
f[h]=find(f[h]);
return f[h];
}
inline int get(){
char cc=getchar();
int res=0;
while (cc<'0'||cc>'9') cc=getchar();
while (cc>='0'&&cc<='9'){
res=(res<<3)+(res<<1)+cc-'0';
cc=getchar();
}
return res;
}
void work(int k){
fu=find(a[k].u);fv=find(a[k].v);
if(fu==fv){printf("%d\n",a[k].t);exit(0);}
f[a[k].u]=find(a[k].v+n);
f[a[k].v]=find(a[k].u+n);
}
int main()
{
n=get();m=get();for(int i=1;i<=2*n;i++) f[i]=i;
for(int i=1;i<=m;i++) {a[i].u=get();a[i].v=get();a[i].t=get();}
sort(a+1,a+1+m,cmp);
for(int i=1;i<=m+1;i++) work(i);
return 0;
}
#include<stdio.h>
#include<algorithm>
#define go(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
struct haha{int x,y,e;}a[100002];
int n,m,dad[40004];
bool tmp(haha a,haha b){return a.e>b.e;}
int find(int x){return dad[x]==x?x:find(dad[x]);}
int main()
{
scanf("%d%d",&n,&m);
go(i,1,m)scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].e);
sort(a+1,a+m+1,tmp);
go(i,1,2*n)dad[i]=i;
go(i,1,m){
int p=find(a[i].x),q=find(a[i].y);
if(p==q){printf("%d",a[i].e);return 0;}
dad[p]=find(a[i].y+n);dad[q]=find(a[i].x+n);}
printf("0");
return 0;
}