首页 > 代码库 > [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 }
[noip2010]关押罪犯 并查集
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。