总共有两个监狱。并且给出
n
≤
2
e
4
n\leq2e4
n≤2e4名罪犯,以及
m
≤
1
e
5
m\leq1e5
m≤1e5对关系,每对关系都有一个权值,然后对于每对关系都要求不能放到同一个监狱里面,然后求问使得最终无法满足条件的最小的权值是多少。
先对权值从小到大排序,然后依次合并,记录每个点到根的距离。如果对于每对关系,两个点已经在同一个集合并且距离奇偶相同,则此处无解,只能输出。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const ll INF=LONG_LONG_MAX;
const int N=1e5+7;
const int M=2e4+7;
struct Point {
int u,v,w;
bool operator <(const Point &rhs) const {
return w>rhs.w;
}
}e[N];
int fa[M],dis[M];
int find(int x) {
if(x==fa[x]) return fa[x];
int t=fa[x];
fa[x]=find(fa[x]);
dis[x]=(dis[x]+dis[t])%2;
return fa[x];
}
void Union(int x,int y) {
int fx=find(x);
int fy=find(y);
fa[fy]=fx;
dis[fy]=(dis[x]+1-dis[y])%2;
}
int main() {
int n,m,ans=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
for(int i=1;i<=n;i++) {
fa[i]=i;
dis[i]=0;
}
sort(e+1,e+1+m);
for(int i=1;i<=m;i++) {
int x=e[i].u,y=e[i].v;
int w=e[i].w;
int fx=find(x);
int fy=find(y);
if(fx==fy&&dis[x]^dis[y]==0) {
ans=w;
break;
}
if(fx!=fy) Union(x,y);
}
printf("%d\n",ans);
return 0;
}