DFS(用并查集也可以做)
//
// main.cpp
// test6
//
// Created by Jacky Roth on 2019/2/28.
// Copyright © 2019 Jacky Roth. All rights reserved.
//
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <vector>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>
using namespace std;
const int maxn=10010;
struct ver {
vector<int>relation;
double set=0,area=0;
}node[maxn];
bool vis[maxn];
unordered_set<int>family;
struct ans {
int id,num;
double am,aa;
};
vector<ans>p;
double house,ground;
int min_id,numbers;
void DFS(int index){
vis[index]=1;
numbers++;
house+=node[index].set;
ground+=node[index].area;
if (index<min_id) {
min_id=index;
}
for (int i=0; i<node[index].relation.size(); i++) {
if (vis[node[index].relation[i]]==0) {
DFS(node[index].relation[i]);
}
}
}
bool cmp(ans a,ans b){
if (a.aa!=b.aa) {
return a.aa>b.aa;
}else{
return a.id<b.id;
}
}
int main(int argc, const char * argv[]) {
memset(vis, 0, sizeof(vis));
int N,id,mom,dad,num,kid;
double es,area;
scanf("%d",&N);
for (int i=0; i<N; i++) {
scanf("%d%d%d%d",&id,&mom,&dad,&num);
family.insert(id);
if (mom!=-1) {
node[id].relation.push_back(mom);
node[mom].relation.push_back(id);
family.insert(mom);
}
if (dad!=-1) {
node[id].relation.push_back(dad);
node[dad].relation.push_back(id);
family.insert(dad);
}
for (int j=0; j<num; j++) {
scanf("%d",&kid);
node[id].relation.push_back(kid);
node[kid].relation.push_back(id);
family.insert(kid);
}
scanf("%lf%lf",&es,&area);
node[id].set=es;
node[id].area=area;
}
int count=0;
for (auto it=family.begin(); it!=family.end(); it++) {
if (vis[*it]==0) {
count++;
house=ground=0;
numbers=0;
min_id=maxn;
DFS(*it);
p.push_back(ans{min_id,numbers,house/(1.0*numbers),ground/(1.0*numbers)});
}
}
sort(p.begin(), p.end(), cmp);
printf("%lu\n",p.size());
for (int i=0; i<p.size(); i++) {
printf("%04d %d %.3f %.3f\n",p[i].id,p[i].num,p[i].am,p[i].aa);
}
return 0;
}