PAT 1114 Family Property (并查集)
2018-03-10 23:30
274 查看
#include<iostream> #include<algorithm> #include<vector> #include<set> using namespace std; #define m 10000 int road[m],n; struct item{//先合并item,才能统计 int id,h,area; }d[1010]; int mem[m];//family mem struct family{ int minid; double avearea, avehouse; }f[m];//打表 bool cmp(family a,family b){ if(a.avearea!=b.avearea) return a.avearea>b.avearea; else return a.minid<b.minid; } int getroot(int x){ if(road[x]==x) return x; else{ int root=getroot(road[x]); road[x]=root; return root; } } void merge(int x,int y){ int u=getroot(x); int v=getroot(y); if(u<v){//u为根 road[v]=u; mem[u]+=mem[v]; }else if(u>v){ road[u]=v; mem[v]+=mem[u]; } } void init(){ for (int i = 0; i < m; i++){ mem[i]=1; road[i]=i; } } int main(){ init(); cin>>n; int id,fid,mid,k; for (int i = 0; i < n; i++){ scanf("%d%d%d%d",&id,&fid,&mid,&k); d[i].id=id; if(fid!=-1) merge(id,fid); if(mid!=-1) merge(id,mid); for (int j = 0; j < k; j++){ int t; scanf("%d",&t); merge(t,id); } scanf("%d%d",&d[i].h,&d[i].area); } for (int i = 0; i < m; i++) getroot(i); set<int> ansid; for (int i = 0; i < n; i++){ int root=getroot(d[i].id); if(ansid.count(root)){ f[root].avearea+=d[i].area; f[root].avehouse+=d[i].h; }else{ f[root].minid=root; f[root].avearea=d[i].area; f[root].avehouse=d[i].h; ansid.insert(root); } } vector<family> ans; for(set<int>::iterator it=ansid.begin();it!=ansid.end();it++){ int t=*it; f[t].avearea=f[t].avearea*1.0/mem[t]; f[t].avehouse=f[t].avehouse*1.0/mem[t]; ans.push_back(f[t]); } sort(ans.begin(),ans.end(),cmp); printf("%d\n",ans.size()); for (int i = 0; i < ans.size(); i++) printf("%.4d %d %.3lf %.3lf\n",ans[i].minid,mem[ans[i].minid],ans[i].avehouse,ans[i].avearea); return 0; }
相关文章推荐
- PAT (Advanced Level) Practise 1114 Family Property (25)
- PAT (Advanced Level) Practise 1114 Family Property (25) 并查集orDFS
- *浙大PAT甲级 1114 并查集
- PAT 1114 Family Property
- pat 甲1114. Family Property (dfs)
- PAT (Advanced Level) Practise 1114 Family Property (25)
- PAT--朋友圈--并查集
- PAT--1118. Birds in Forest(并查集)
- pat甲1118. Birds in Forest(并查集)
- PAT L2-010. 排座位 疑似种类并查集
- PAT (Advanced Level)1118. Birds in Forest (25)&&1114. Family Property (25)并查集找爸爸
- pat中关于并查集的题目&&以及类似dfs解法
- PAT L2-007. 家庭房产 (并查集)
- PAT ~ L2-010. 排座位 (并查集)
- 1114. Family Property
- PAT--1013 Battle Over Cities(并查集)
- PAT--1114. Family Property(并查集)
- PAT L2-020 功夫传人 (17分并查集)
- PAT L2-010. 排座位 疑似种类并查集
- PAT 1114