# 题意
一共两座监狱,n个罪犯编号为1~n,两个罪犯之间有怨气值c,如果处在同一个监狱,就会爆发值为c的冲突
给出m对怨气值,分别安排在着两座监狱,使得满足关系并且最大的怨气值最小
# 题解
一共两座监狱关系明显具有传递性,贪心,从大到小排序,如果当前已经在同一个监狱直接输出即可
将每个x_表示不和x一个集合为x+n,y_表示不和y一个集合为y+n
合并x、y时候将y合并到x_,x合并到y_
1 #include <bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 const int N=2e4+10,M=1e5+10; 5 struct p { 6 ll x,y,c; 7 bool operator <(const p x){ 8 return c>x.c; 9 } 10 }e[M]; 11 ll fa[N*2]; 12 int find(int x){ 13 if(fa[x]!=x) fa[x]=find(fa[x]); 14 return fa[x]; 15 } 16 int main(){ 17 int n,m; 18 cin>>n>>m; 19 for(int i=0;i<=n*2;i++) 20 fa[i]=i; 21 for(int i=0;i<m;i++){ 22 cin>>e[i].x>>e[i].y>>e[i].c; 23 } 24 sort(e,e+m); 25 for(int i=0;i<m;i++){ 26 int x=find(e[i].x),y=find(e[i].y); 27 int sx=find(e[i].x+n),sy=find(e[i].y+n); 28 if(find(x)==find(y)){ 29 cout<<e[i].c<<endl; 30 return 0; 31 } 32 fa[x]=sy; 33 fa[y]=sx; 34 } 35 cout<<"0"<<endl; 36 }