天体赛L2-007. 家庭房产

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

这几天一直在练并查集。。。

 1 #include <cstdio>
 2 #include <algorithm>
 3 
 4 using namespace std;
 5 
 6 const double EPS=0.0001;
 7 
 8 struct Node {
 9     int index,peo;
10     double buil,area;
11 
12     bool operator < (const Node& a) const {
13         return area-EPS>a.area||(abs(area-a.area)<EPS&&index<a.index);
14     }
15 }que[10005];
16 
17 struct Fam {
18     int i,f,m,k[5],n,b,a;
19 }p[1005];
20 
21 int n,pa,pb,tail;
22 int par[10005],mn[100005],peo[10005],buil[10005],area[10005];
23 bool vis[10005];
24 
25 int getPar(int a) {
26     if(par[a]!=a) {
27         par[a]=getPar(par[a]);
28     }
29     return par[a];
30 }
31 
32 void merg(int a,int b) {
33     pa=getPar(a);
34     pb=getPar(b);
35     if(pa!=pb) {
36         par[pb]=pa;
37         mn[pa]=min(mn[pa],mn[pb]);
38         peo[pa]+=peo[pb];
39         buil[pa]+=buil[pb];
40         area[pa]+=area[pb];
41     }
42 }
43 
44 int main() {
45     while(1==scanf("%d",&n)) {
46         for(int i=0;i<10000;++i) {
47             par[i]=mn[i]=i;
48             peo[i]=1;
49             buil[i]=0;
50             area[i]=0;
51             vis[i]=true;
52         }
53         for(int i=0;i<n;++i) {
54             scanf("%d%d%d%d",&p[i].i,&p[i].f,&p[i].m,&p[i].n);
55             for(int j=0;j<p[i].n;++j) {
56                 scanf("%d",&p[i].k[j]);
57             }
58             scanf("%d%d",&buil[p[i].i],&area[p[i].i]);
59         }
60         for(int i=0;i<n;++i) {
61             vis[p[i].i]=false;
62             if(p[i].f!=-1) {
63                 merg(p[i].i,p[i].f);
64                 vis[p[i].f]=false;
65             }
66             if(p[i].m!=-1) {
67                 merg(p[i].i,p[i].m);
68                 vis[p[i].m]=false;
69             }
70             for(int j=0;j<p[i].n;++j) {
71                 if(p[i].k[j]!=-1) {
72                     merg(p[i].i,p[i].k[j]);
73                     vis[p[i].k[j]]=false;
74                 }
75             }
76         }
77         tail=0;
78         for(int i=0;i<10000;++i) {
79             if(!vis[i]&&par[i]==i) {
80                 que[tail].index=mn[i];
81                 que[tail].peo=peo[i];
82                 que[tail].area=1.0*area[i]/peo[i];
83                 que[tail++].buil=1.0*buil[i]/peo[i];
84             }
85         }
86         sort(que,que+tail);
87         printf("%d\n",tail);
88         for(int i=0;i<tail;++i) {
89             printf("%04d %d %.3lf %.3lf\n",que[i].index,que[i].peo,que[i].buil,que[i].area);
90         }
91     }
92     return 0;
93 }

参考链接:http://doc.okbase.net/idealism_xxm/archive/229098.html

 

posted @ 2016-06-28 16:11  vxee  阅读(170)  评论(0编辑  收藏  举报