题目链接: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 ",tail); 88 for(int i=0;i<tail;++i) { 89 printf("%04d %d %.3lf %.3lf ",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