poj 1838

http://poj.org/problem?id=1838

并查集,,,计算总共个数的模版。。。。。

 1 #include <iostream>
 2 #define maxn 16006
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 struct node{
 7     int x,y;
 8     int index;
 9 }q[maxn];
10 
11 int f[maxn],rank[maxn],sum[maxn];
12 
13 void init(int n){
14     for(int i=0;i<=n;i++){
15         f[i] = i;
16         rank[i]=1;
17     }
18 }
19 
20 bool cmp_x(node a, node b){
21     if(a.x==b.x)
22         return a.y<b.y;
23     return a.x<b.x;
24 }
25 
26 bool cmp_y(node a,node b){
27     if(a.y==b.y)
28         return a.x<b.x;
29     return a.y<b.y;
30 }
31 bool cmp(int x, int y){
32     return x>y;
33 }
34 
35 int find(int x){
36     if(x!=f[x])
37         f[x] = find(f[x]);
38     return f[x];
39 }
40 
41 void unin(int x, int y){
42     int fx = find(x);
43     int fy = find(y);
44     if(fx==fy)
45         return;
46     if(rank[fx]>rank[fy]){
47         rank[fx] += rank[fy];//求共有多少节点
48         f[fy] = fx;
49     }
50     else {
51         rank[fy] += rank[fx];
52         f[fx] = fy;
53 
54     }
55     return ;
56 }
57 
58 int main()
59 {
60     int n , k;
61     while(cin>>n>>k){
62         init(n);
63         for(int i=1;i<=n;i++){
64             cin>>q[i].x>>q[i].y;
65             q[i].index=i;
66         }
67         sort(q+1,q+1+n,cmp_x);//合并x方向
68         for(int i=1;i<n;i++){
69             if(q[i].x==q[i+1].x&&q[i].y+1==q[i+1].y)
70                 unin(q[i].index,q[i+1].index);
71         }
72         sort(q+1,q+1+n,cmp_y);//合并y方向
73         for(int i=1;i<n;i++){
74             if(q[i].y==q[i+1].y&&q[i].x+1==q[i+1].x)
75                 unin(q[i].index,q[i+1].index);
76         }
77         int cnt =0;
78         for(int i=1;i<=n;i++){//取出f[i]==i的节点
79             if(f[i]==i)
80                 sum[cnt++] = rank[i];
81         }
82         sort(sum,sum+cnt,cmp);//找出k个
83         int ssum =0;
84         for(int i=0;i<k;i++)
85             ssum += sum[i];
86         cout<<ssum<<endl;
87     }
88     return 0;
89 }

 

posted @ 2013-08-01 19:32  夜晓楼  阅读(152)  评论(0编辑  收藏  举报