[noip2010]关押罪犯 并查集

Posted CHADLZX

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[noip2010]关押罪犯 并查集相关的知识,希望对你有一定的参考价值。

第一次看的时候想到了并查集,但是不知道怎么实现;

标解,f[i]表示i所属的集合,用f[i+n]表示i所属集合的补集,实现的很巧妙,可以当成一个使用并查集的巧妙应用;

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<map>
 6 #include<ctime>
 7 #include<vector>
 8 #include<set>
 9 #include<cmath>
10 #include<algorithm>
11 using namespace std;
12 const int maxn=20200;
13 struct node{
14     int x,y,v;
15     bool operator<(const node& b)const{return v>b.v;}
16 }e[120000];
17 int f[maxn<<1],n,m;
18 void init(){
19     scanf("%d%d",&n,&m);
20     for(int i=1;i<=m;i++)scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].v);
21     sort(e+1,e+m+1);
22 }
23 void print(int x){cout<<x<<endl;exit(0);}
24 int getfather(int x){return f[x]==x?x:f[x]=getfather(f[x]);}
25 void work(){
26     for(int i=1;i<=(n<<1);i++)f[i]=i;
27     int x,y;
28     for(int i=1;i<=m;i++){
29         x=getfather(e[i].x);y=getfather(e[i].y);
30         if(x==y)print(e[i].v);
31         else {f[x]=getfather(e[i].y+n),f[y]=getfather(e[i].x+n);}
32     }
33     print(0);
34 }
35 int main(){
36     init();
37     work();
38 }
View Code

 

以上是关于[noip2010]关押罪犯 并查集的主要内容,如果未能解决你的问题,请参考以下文章

[NOIP2010提高组]关押罪犯

并查集的补集 (关押罪犯)

洛谷 P1525 关押罪犯==codevs 1069 关押罪犯[NOIP 2010]

NOIP2010 提高组 洛谷P1525 关押罪犯

洛谷P1525关押罪犯——并查集

并查集关押罪犯