L2-007. 家庭房产

L2-007. 家庭房产

题目链接:https://www.patest.cn/contests/gplt/L2-007

并查集

初学,看这题的时候完全没有什么好的想法,参考了@yinzm的blog用BFS做了一遍,错了三个测试点,找了一下午没找出来,另寻他法。看到了并查集这个概念,做了一两题稍微掌握了一下,尝试做这题。

代码如下:

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<algorithm>
  4 #include<cmath>
  5 #define EPS 1e-8
  6 #define N 10000
  7 using namespace std;
  8 struct node{
  9     int house,area;
 10 };
 11 struct res{
 12     int num;
 13     int people;
 14     int house;
 15     int area;
 16     double rh,ra;
 17 };
 18 res r[1000];
 19 int k;
 20 node a[N];
 21 int pre[N];
 22 bool mark[N];
 23 void Make(){
 24     for(int i=0;i<N;++i)pre[i]=i;
 25 }
 26 int Find(int x){
 27     if(x!=pre[x])
 28         pre[x]=Find(pre[x]);
 29     return pre[x];
 30 }
 31 void uion(int x,int y){
 32     int k1=Find(x),k2=Find(y);
 33     k1<k2?pre[k2]=k1:pre[k1]=k2;
 34 }
 35 bool compare(res x,res y){
 36     if(fabs(x.ra-y.ra)<EPS)return x.num<y.num;
 37     else return x.ra>y.ra;
 38 }
 39 int main(void){
 40     freopen("in.txt","r",stdin);
 41     int n;
 42     scanf("%d",&n);
 43     Make();
 44     for(int i=0;i<n;++i){
 45         int me,father,mother,num,kid[5],house,area;
 46         scanf("%d%d%d%d",&me,&father,&mother,&num);
 47         mark[me]=1;
 48         if(father!=-1){
 49             uion(me,father);
 50             mark[father]=1;
 51         }
 52         if(mother!=-1){
 53             uion(me,mother);
 54             mark[mother]=1;
 55         }
 56         for(int i=0;i<num;++i){
 57             scanf("%d",&kid[i]);
 58             mark[kid[i]]=1;
 59             uion(me,kid[i]);
 60         }
 61         scanf("%d%d",&house,&area);
 62         a[me].house=house;
 63         a[me].area=area;
 64     }
 65     for(int i=0;i<N;++i)
 66         Find(i);
 67     int p;
 68     for(int i=0;i<N;++i){
 69         if(mark[i]){
 70             if(k==0){
 71                 r[k].num=pre[i];
 72                 r[k].people++;
 73                 r[k].house=a[i].house;
 74                 r[k].area=a[i].area;
 75                 k++;
 76             }else{
 77                 bool flag=true;
 78                 for(p=0;p<k;++p){
 79                     if(r[p].num==pre[i]){
 80                         flag=false;
 81                         break;
 82                     }
 83                 }
 84                 if(flag){
 85                     r[k].num=pre[i];
 86                     r[k].people++;
 87                     r[k].house=a[i].house;
 88                     r[k].area=a[i].area;
 89                     k++;
 90                 }else{
 91                     r[p].people++;
 92                     r[p].house+=a[i].house;
 93                     r[p].area+=a[i].area;
 94                 }
 95             }
 96         }
 97     }
 98     for(int i=0;i<k;++i){
 99         r[i].rh=r[i].house*1.0/r[i].people;
100         r[i].ra=r[i].area*1.0/r[i].people;
101     }
102     printf("%d\n",k);
103     sort(r,r+k,compare);
104     for(int i=0;i<k;++i)
105         printf("%04d %d %.3lf %.3lf\n",r[i].num,r[i].people,r[i].rh,r[i].ra);
106     return 0;
107 }
posted @ 2016-05-31 15:05  barriery  阅读(492)  评论(0编辑  收藏  举报