关押罪犯(扩展域

# 题意

一共两座监狱,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 }

猜你喜欢

转载自www.cnblogs.com/hhyx/p/12453272.html
今日推荐