我在初始化的地方错了,后面找了好久才找出来。呜呜呜
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <stdio.h>
#include <math.h>
#include <queue>
using namespace std;
int father[10000];
bool visit[10000];
struct Data{
int id,fid,mid,num,area;
int cid[10];
}data[10000];
struct node {
int id,people;
double num,area;
bool flag=false;
}ans[10000];
bool cmp1 (node a,node b){
if(a.area!=b.area){
return a.area>b.area;
}
else{
return a.id<b.id;
}
}
void init(int n){
for(int i=0;i<n;i++){
father[i]=i;
}
}
int findFather(int x){
int a=x;
while(x!=father[x]){
x=father[x];//出错的地方1
}
return x;
}
void Union (int a,int b){
int x=findFather(a);
int y=findFather(b);
if(x>y){
father[x]=y;
}else{
father[y]=x;
}
}
int main(){
int num;
int cnt=0;
int k;//孩子数
scanf("%d",&num);
//init(num);
//原本是这么写的,找了半天!!!!!改成下面那个才通过。呜呜呜
init(10000);
for(int i=0;i<num;i++){
scanf("%d %d %d %d",&data[i].id,&data[i].fid,&data[i].mid,&k);
visit[data[i].id]=true;
if(data[i].fid!=-1){
visit[data[i].fid]=true;
Union(data[i].id,data[i].fid);
}
if(data[i].mid!=-1){
visit[data[i].mid]=true;
Union(data[i].id,data[i].mid);
}
for(int j=0;j<k;j++){
scanf("%d",&data[i].cid[j]);
visit[data[i].cid[j]]=true;
Union(data[i].cid[j],data[i].id);
}
scanf("%d %d",&data[i].num,&data[i].area);
}
for(int i=0;i<num;i++){
int id=findFather(data[i].id);
ans[id].id=id;
ans[id].area+=data[i].area;
ans[id].num+=data[i].num;
ans[id].flag=true;
}
for(int i=0;i<10000;i++){
if(visit[i]){
ans[findFather(i)].people++;
}
if(ans[i].flag){
cnt++;
}
}
for(int i=0;i<10000;i++){
if(ans[i].flag){
ans[i].num=(double)(ans[i].num*1.0/ans[i].people);
ans[i].area=(double)(ans[i].area*1.0/ans[i].people);
}
}
sort(ans,ans+10000,cmp1);
printf("%d\n",cnt);
for(int i=0;i<cnt;i++){
if(ans[i].flag){
printf("%04d %d %.3f %.3f\n",ans[i].id,ans[i].people,ans[i].num,ans[i].area);
}
}
}