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 }
相關文章
相關標籤/搜索