首页 > 代码库 > [noip2010]关押罪犯 并查集

[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]关押罪犯 并查集