PAT A1114 family property (25)
2017-03-04 01:26
351 查看
//用到并查集,有关系的人在一个圈子里,合并的时候注意根设为id较小的那个。遍历统计root和计房产数和面积,我单独开了一个数组放rootid
#include<cstdio> #include<vector> #include<set> #include<algorithm> using namespace std; int n; int father[10010]; int isroot[10010]; int familynum[10010]={0}; double avgsets[10010]={0}; double avgarea[10010]={0}; set<int> idset; vector<int> rootid; struct node{ int id; int father,mother; int k; vector<int> child; int mestate; int area; }node[10010]; void init(){ for(int i=0;i<10010;i++){ father[i]=i; } } int findfather(int x){ int a=x; while(x!=father[x]){ x=father[x]; } while(a!=father[a]){ int z=a; father[a]=x; a=father[z]; } return x; } void Union(int a,int b){ int faA=findfather(a); int faB=findfather(b); if(faA!=faB){ if(faA<faB) father[faB]=faA; else father[faA]=faB; } } int cmp(int a,int b){ if(((double)avgarea[a]/familynum[a])!=((double)avgarea[b]/familynum[b])) return ((double)avgarea[a]/familynum[a])>((double)avgarea[b]/familynum[b]); else return a<b; } int main(){ init(); scanf("%d",&n); int id,mo,fa,k,temp,estate,area; int i; for(i=0;i<n;i++){ scanf("%d%d%d%d",&id,&fa,&mo,&k); node[id].father=fa; idset.insert(id); if(fa!=-1){ Union(id,fa); idset.insert(fa); } node[id].mother=mo; if(mo!=-1){ Union(id,mo); idset.insert(mo); } node[id].k=k; for(int j=0;j<k;j++){ scanf("%d",&temp); node[id].child.push_back(temp); Union(id,temp); idset.insert(temp); } scanf("%d%d",&estate,&area); node[id].mestate=estate; node[id].area=area; } set<int>::iterator it=idset.begin(); int num=0; for(it;it!=idset.end();it++){ if(*it==findfather(*it)){ isroot[*it]=1; rootid.push_back(*it); num++; } familynum[findfather(*it)]++; avgsets[findfather(*it)]+=node[*it].mestate; avgarea[findfather(*it)]+=node[*it].area; } printf("%d\n",num); sort(rootid.begin(),rootid.end(),cmp); vector<int>::iterator it2=rootid.begin(); for(it2=rootid.begin();it2!=rootid.end();it2++){ if(isroot[*it2]==1){ printf("%04d %d %.3f %.3f\n",*it2,familynum[*it2],(double)avgsets[*it2]/familynum[*it2],(double)avgarea[*it2]/familynum[*it2]); } } system("pause"); return 0; }
相关文章推荐
- 1114. Family Property (25)
- Family Property (25)解题报告
- PAT (Advanced Level) Practise 1114 Family Property (25) 并查集orDFS
- PAT (Advanced Level) Practise 1114 Family Property (25)
- 1114. Family Property (25)
- PAT (Advanced Level) Practise 1114 Family Property (25)
- IOS 开发学习25 NSData 的一些基本操作
- 【PAT】1006. Sign In and Sign Out (25)
- 4000 PAT 甲级2017_12_09_B_Final_Grading_25_2
- 1020. Tree Traversals (25) -BFS
- PAT (Advanced Level) 1006. Sign In and Sign Out (25) 解题报告
- 25 this关键字 异常捕获 类
- 剑指oofer 25 - 二叉树中和为某一值的路径
- PAT(甲级)1055. The World's Richest (25)
- PAT 1060. Are They Equal (25) 浮点数转化 字符串处理
- 1028. List Sorting (25)
- 1106. Lowest Price in Supply Chain (25)
- PAT 1070. Mooncake (25) 贪心
- 04-树7. Search in a Binary Search Tree (25)
- 1067. Sort with Swap(0,*) (25) PAT甲级