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 }