码迷,mamicode.com
首页 > 其他好文 > 详细

[noip2010]关押罪犯 并查集

时间:2016-09-08 21:38:04      阅读:110      评论:0      收藏:0      [点我收藏+]

标签:

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

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

标签:

原文地址:http://www.cnblogs.com/chadinblog/p/5854497.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!