解题思路
对每个有关系的 id 进行并查集的合并操作。合并时注意处理面积、房的套数。
参考代码
#include<stdio.h>
#include<iostream>
#include<vector>
#include<cstring>
#include<cstdio>
#include<climits>
#include<cmath>
#include<algorithm>
#include<queue>
#include<deque>
#include<map>
#include<unordered_map>
#include<set>
#include<stack>
//#define LOCAL //提交时一定注释
#define VI vector<int>
#define io ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
using namespace std;
typedef long long LL;
typedef double db;
const int inf = 0x3f3f3f3f;
const LL INF = 1e18;
const int N = 1e4 + 10;
inline int readint() {int x; scanf("%d", &x); return x;}
struct node{
int id; //最小的id
set<int> st; //存家庭成员的id
int a, s; //面积,房的数量
db aa, as;
node() {id = inf, a = s = 0;}
bool operator < (const node& y) const{
if (aa != y.aa) return aa > y.aa;
return id < y.id;
}
}s[N];
int fa[N], vis[N];
void merge(int u, int v) {
if (u == v) return;
fa[u] = v;
s[v].id = min(s[v].id, s[u].id);
s[v].a += s[u].a;
s[v].s += s[u].s;
for(auto it = s[u].st.begin(); it != s[u].st.end(); ++it) {
s[v].st.insert(*it);
}
}
int find(int x) {
return x == fa[x] ? x : fa[x] = find(fa[x]);
}
void init() {
for(int i = 0; i < N; ++i) {
fa[i] = i;
s[i].st.insert(i);
s[i].id = i;
}
}
int main() {
#ifdef LOCAL
freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
#endif
int t = readint();
init();
int k;
while (t--) {
k = readint();
vis[k] = true;
int rt = find(k);
for(int i = 1; i <= 2; ++i) {
k = readint();
vis[k] = true;
if (k != -1)
merge(find(k), rt);
}
int num = readint();
for(int i = 1; i <= num; ++i) {
k = readint();
vis[k] = true;
merge(find(k), rt);
}
s[rt].s += readint();
s[rt].a += readint();
}
vector<node> ans;
for(int i = 0; i < N; ++i) {
if (vis[i] && fa[i] == i) {
// cout << "rt:" << i << " a:" << s[i].a << " sz:" << s[i].st.size();
int sz = s[i].st.size();
s[i].aa = 1.0 * s[i].a / sz;
// cout << "aa: " << s[i].aa << endl;
s[i].as = 1.0 * s[i].s / sz;
ans.push_back(s[i]);
}
}
sort(ans.begin(), ans.end());
printf("%d\n", (int)ans.size());
for(auto m : ans) {
printf("%04d %d %.3f %.3f\n", m.id, m.st.size(), m.as, m.aa);
}
return 0;
}