zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    OC-KVO简介
    注册审核
    应用权限
    关于函数执行的一点知识
    设置权限
    文件操作实例:文件管理器(网页版)
    文件操作
    正则表达式
    全局变量和递归
    案例:简单留言板
  • 原文地址:https://www.cnblogs.com/Bang-cansee/p/3230978.html
Copyright © 2011-2022 走看看