C++ 结构体和并查集:计算家族成员平均数据
#include
struct DATA { // 定义结构体DATA int id,fa,ma,num,area; // 结构体成员变量 int child[10]; // 结构体成员数组 } a[MAX]; // 定义结构体数组a,大小为MAX
struct node { // 定义结构体node int id,people; double num,area; bool flag=false; // 结构体成员变量,默认值为false } b[MAX]; // 定义结构体数组b,大小为MAX
int father[MAX]; // 定义数组father,大小为MAX bool visit[MAX]; // 定义数组visit,大小为MAX int k,cnt=0; // 定义变量k和cnt,初始化为0
int find(int x) { // 定义函数find,参数为整数x while(x!=father[x]) // 当x不等于father[x]时,执行循环 x=father[x]; // 将father[x]赋值给x return x; // 返回x }
void Union(int a,int b) { // 定义函数Union,参数为整数a和整数b int faA=find(a); // 调用find函数,将返回值赋值给faA int faB=find(b); // 调用find函数,将返回值赋值给faB if(faA>faB) // 如果faA大于faB father[faA]=faB; // 将faB赋值给father[faA] else if(faA<faB) // 如果faA小于faB father[faB]=faA; // 将faA赋值给father[faB] }
int cmp(node a,node b) { // 定义函数cmp,参数为结构体a和结构体b if(a.area!=b.area) // 如果a的area不等于b的area return a.area>b.area; // 返回a的area是否大于b的area return a.id<b.id; // 返回a的id是否小于b的id }
int main() { // 主函数 int n; // 定义变量n cin>>n; // 输入n的值 for(int i=0; i<MAX; i++) // 遍历i从0到MAX-1 father[i]=i; // 将i赋值给father[i] for(int i=0; i<n; i++) { // 遍历i从0到n-1 cin>>a[i].id>>a[i].fa>>a[i].ma>>k; // 输入a[i].id、a[i].fa、a[i].ma和k的值 visit[a[i].id]=1; // 将1赋值给visit[a[i].id] if(a[i].fa!=-1) { // 如果a[i].fa不等于-1 visit[a[i].fa]=1; // 将1赋值给visit[a[i].fa] Union(a[i].fa,a[i].id); // 调用Union函数,传入参数a[i].fa和a[i].id } if(a[i].ma!=-1) { // 如果a[i].ma不等于-1 visit[a[i].ma]=1; // 将1赋值给visit[a[i].ma] Union(a[i].ma,a[i].id); // 调用Union函数,传入参数a[i].ma和a[i].id } for(int j=0; j<k; j++) { // 遍历j从0到k-1 cin>>a[i].child[j]; // 输入a[i].child[j]的值 visit[a[i].child[j]]=1; // 将1赋值给visit[a[i].child[j]] Union(a[i].child[j],a[i].id); // 调用Union函数,传入参数a[i].child[j]和a[i].id } cin>>a[i].num>>a[i].area; // 输入a[i].num和a[i].area的值 } for(int i=0; i<n; i++) { // 遍历i从0到n-1 int id=find(a[i].id); // 调用find函数,将返回值赋值给id b[id].id=id; // 将id赋值给b[id].id b[id].num+=a[i].num; // 将a[i].num加到b[id].num上 b[id].area+=a[i].area; // 将a[i].area加到b[id].area上 b[id].flag=1; // 将1赋值给b[id].flag } for(int i=0; i<MAX; i++) { // 遍历i从0到MAX-1 if(visit[i]) // 如果visit[i]为true b[find(i)].people++; // 将b[find(i)].people加1 if(b[i].flag) // 如果b[i].flag为true cnt++; // cnt加1 } for(int i=0; i<MAX; i++) { // 遍历i从0到MAX-1 if(b[i].flag) { // 如果b[i].flag为true b[i].num=1.0b[i].num/b[i].people; // 将b[i].num除以b[i].people,结果赋值给b[i].num b[i].area=1.0b[i].area/b[i].people; // 将b[i].area除以b[i].people,结果赋值给b[i].area } } sort(b,b+MAX,cmp); // 调用sort函数,将b数组按照cmp函数的规则进行排序 cout<<cnt<<endl; // 输出cnt的值 for(int i=0; i<cnt; i++) // 遍历i从0到cnt-1 printf("%04d %d %.3f %.3f\n",b[i].id,b[i].people,b[i].num,b[i].area); // 输出b[i].id、b[i].people、b[i].num和b[i].area的值 return 0; // 程序结束
原文地址: https://www.cveoy.top/t/topic/qjaj 著作权归作者所有。请勿转载和采集!