此题一般是用并查集解,在这里提供DFS的解法,供大家参考~
#include<iostream>
#include<map>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 100000;
struct people
{
int id;
double estateNum, estateArea;
} People[maxn];
struct family
{
int minId, member;
double everNum, everArea;
} Family[maxn];
int n, cnt = 0, famNUm = 0;
map<int, int> id_index;
map<int, int> index_id;
vector<int> Adj[maxn];
bool isVis[maxn];
bool cmp(family a,family b)
{
if(a.everArea!=b.everArea)
return a.everArea > b.everArea;
else
return a.minId < b.minId;
}
int change(int id)
{
if(id_index.find(id)!=id_index.end())
return id_index[id];
else
{
id_index[id] = 10000 + cnt++;
index_id[id_index[id]] = id;
return id_index[id];
}
}
void DFS(int v,int &member,int &minId,double &numSum,double &areaSum)
{
if(index_id[v]<minId)
{
minId = index_id[v];
}
isVis[v] = true;
for (int i = 0; i < Adj[v].size();i++)
{
int u = Adj[v][i];
if(isVis[u]==false)
{
numSum += People[u].estateNum;
areaSum += People[u].estateArea;
member++;
DFS(u, member, minId, numSum, areaSum);
}
}
}
void init()
{
for (int i = 0; i < maxn;i++)
{
People[i].estateNum = People[i].estateArea = 0;
Family[i].minId = i;
Family[i].everArea = Family[i].everNum = 0;
}
}
int main()
{
init();
memset(isVis, false, sizeof(isVis));
scanf("%d", &n);
int id, fId, mId, childNum, childId;
double num,area;
for (int i = 0; i < n;i++)
{
scanf("%d%d%d", &id, &fId, &mId);
int a = change(id);
if(fId!=-1)
{
Adj[a].push_back(change(fId));
Adj[change(fId)].push_back(a);
}
if(mId!=-1)
{
Adj[a].push_back(change(mId));
Adj[change(mId)].push_back(a);
}
scanf("%d", &childNum);
for (int j = 0; j < childNum;j++)
{
scanf("%d", &childId);
Adj[a].push_back(change(childId));
Adj[change(childId)].push_back(a);
}
scanf("%lf%lf", &num, &area);
People[a].id = a, People[a].estateNum = num, People[a].estateArea = area;
}
for (int i = 10000; i < 10000 + cnt;i++)
{
if(isVis[i]==false)
{
famNUm++;
int member=1, minId=maxn;
double numSum = People[i].estateNum, areaSum = People[i].estateArea;
DFS(i, member, minId, numSum, areaSum);
Family[minId].minId = minId;
Family[minId].member = member;
Family[minId].everNum = numSum / member;
Family[minId].everArea = areaSum / member;
}
}
sort(Family, Family + maxn, cmp);
printf("%d\n", famNUm);
for (int i = 0; i < famNUm;i++)
{
printf("%04d %d %.3f %.3f\n", Family[i].minId, Family[i].member, Family[i].everNum, Family[i].everArea);
}
return 0;
}