L2-007. 家庭房产(并查集)

 1 #include <cstdio>
 2 #include <set>
 3 #include <vector>
 4 #include <algorithm>
 5 using namespace std;
 6 const int N=1e4+5;
 7 const int inf=1e8;
 8 int n;
 9 int f[N];
10 set<int>st,tt;
11 set<int>::iterator it;
12 struct node{
13     int ns=0,S=0;
14 }peo[N];
15 struct edge{
16     int Min=inf,num=0;
17     double avgHouse=0,avgS=0;
18     bool operator < (const edge x)const &{
19         if(x.avgS==avgS){
20             return x.Min>Min;
21         }
22         return x.avgS<avgS;
23     }
24 }res[N];
25 vector<edge>sus;
26 void init(){
27     for (int i=0; i<N; i++) {
28         f[i]=i;
29     }
30 }
31 int query(int x){
32     int r=x;
33     while (f[x]!=x) {
34         x=f[x];
35     }
36     f[r]=x;
37     return x;
38 }
39 void join(int x,int y){
40     int fx=query(x);
41     int fy=query(y);
42     if(fx!=fy){
43         f[fx]=fy;
44     }
45 }
46 void checkjoin(int x,int d,int m){
47     st.insert(x);
48     if(d!=-1 && m!=-1){
49         st.insert(d);
50         st.insert(m);
51         join(d, m);
52         join(x, d);
53     }else if(d!=-1){
54         st.insert(d);
55         join(x, d);
56     }else if(m!=-1){
57         st.insert(m);
58         join(x, m);
59     }
60 }
61 int main(){
62     int x,d,m,k,c;
63     init();
64     scanf("%d",&n);
65     for (int i=0; i<n; i++) {
66         scanf("%d%d%d",&x,&d,&m);
67         checkjoin(x, d, m);
68         scanf("%d",&k);
69         for (int j=0; j<k; j++) {
70             scanf("%d",&c);
71             st.insert(c);
72             join(c, x);
73         }
74         scanf("%d%d",&peo[x].ns,&peo[x].S);
75     }
76     for (it=st.begin(); it!=st.end(); it++) {
77         x=*it;
78         int fx=query(x);
79         if (x==fx)  tt.insert(x);
80         res[fx].Min=min(res[fx].Min, x);
81         res[fx].num++;
82         res[fx].avgHouse+=peo[x].ns;
83         res[fx].avgS+=peo[x].S;
84     }
85     for (it=tt.begin(); it!=tt.end(); it++) {
86         x=*it;
87         res[x].avgHouse/=res[x].num;
88         res[x].avgS/=res[x].num;
89         sus.push_back(res[x]);
90     }
91     sort(sus.begin(), sus.end());
92     printf("%d\n",(int)sus.size());
93     for (int i=0; i<sus.size(); i++) {
94         printf("%04d %d %.3lf %.3lf\n",sus[i].Min,sus[i].num,sus[i].avgHouse,sus[i].avgS);
95     }
96     return 0;
97 }

 

posted @ 2018-03-14 18:15  ventricle  阅读(316)  评论(0编辑  收藏  举报