感觉自己写的有点繁琐
多亏了set容器
#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
const int MAX = 10010;
struct node{
int id;
int fa,mo;
int k;
vector<int> child;
int m;
int area;
};
struct family{
int root;
int num;
int set;
int area;
double averset;
double averarea;
};
vector<node> all_nodes;
set<int> rootid,allid;
int father[MAX];
void init(){
for(int i=0;i<MAX;i++){
father[i]=i;
}
}
int findfather(int x){
if(father[x]==x) return x;
else{
int F=findfather(father[x]);
father[x]=F;
return F;
}
}
void Union(int a ,int b){
int FaA=findfather(a);
int FbB=findfather(b);
if(FaA!=FbB){
father[FaA]=FbB;
}
}
int findminid(node n){
int minid=n.id;
if(n.fa!=-1&&n.fa<minid) minid=n.fa;
if(n.mo!=-1&&n.mo<minid) minid=n.mo;
for(int i=0;i<n.k;i++){
if(n.child[i]<minid) minid=n.child[i];
}
return minid;
}
bool compare(family a,family b){
if(a.averarea>b.averarea) return true;
else if(a.averarea==b.averarea&&a.root<b.root) return true;
else return false;
}
int main(){
init();
int n;
cin>>n;
for(int i=0;i<n;i++){
node a;
scanf("%d%d%d%d",&a.id,&a.fa,&a.mo,&a.k);
allid.insert(a.id);
if(a.fa!=-1){
Union(a.id,a.fa);
allid.insert(a.fa);
}
if(a.mo!=-1){
Union(a.id,a.mo);
allid.insert(a.mo);
}
for(int j=0;j<a.k;j++){
int temp;
scanf("%d",&temp);
a.child.push_back(temp);
allid.insert(temp);
Union(a.id,temp);
}
scanf("%d%d",&a.m,&a.area);
all_nodes.push_back(a);
}
for(int i=0;i<n;i++){
int root=findfather(all_nodes[i].id);
rootid.insert(root);
}
vector<family> all_fam;
for(set<int>::iterator it=rootid.begin();it!=rootid.end();it++){
family fam;
fam.area=0;
fam.num=0;
fam.set=0;
int minroot=*it;
for(int i=0;i<n;i++){
int root=findfather(all_nodes[i].id);
if(*it==root){
int tempminroot=findminid(all_nodes[i]);
if(tempminroot<minroot) minroot=tempminroot;
fam.set+=all_nodes[i].m;
fam.area+=all_nodes[i].area;
}
}
fam.root=minroot;
for(set<int>::iterator j=allid.begin();j!=allid.end();j++){
if(findfather(*j)==*it) fam.num++;
}
fam.averset=fam.set*1.0/fam.num;
fam.averarea=fam.area*1.0/fam.num;
all_fam.push_back(fam);
}
sort(all_fam.begin(),all_fam.end(),compare);
cout<<all_fam.size()<<endl;
for(int i=0;i<all_fam.size();i++){
printf("%04d %d %.3lf %.3lf\n",all_fam[i].root,all_fam[i].num,all_fam[i].averset,all_fam[i].averarea);
}
}
本文介绍了一种利用C++中的set容器来优化家族成员数据处理的方法。通过对家族成员信息进行整理,包括家庭成员数量、家庭面积等信息,并通过特定算法进行排序,实现了对家族数据的有效管理和展示。
5297

被折叠的 条评论
为什么被折叠?



