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 }