https://blog.csdn.net/zpjlkjxy/article/details/79689536
要搞清楚一些细节
1.我们要用到并查集
什么是并查集?并查集有什么用?
并查集就是把有关系的点连在一起成线,成树。
在做题时,我们经常把有关系的人用并查集的方法来联系在一起,成组
下面是并查集(压缩路径)的模板
int findFather(int x){
if(x==father[x])return x;
else{
int F=findFather(father[x]);
father[x]=F;
return F;
}
}
//因为本题目要把一个家庭中的最小编号输出,所以我们以最小编号为根节点
void Union(int a,int b){
int faA=findFather(a);
int faB=findFather(b);
if(faA>faB)
father[faA]=faB;
else
father[faB]=faA;
}
void init(){
for(int i=0;i<10010;i++){
father[i]=i;
}
}
//不用太纠结他们到底是什么关系,只要有关系,我们就把他们联系在一起,放在一个组
//我们可以根据需要来改变根节点
//在本题中,我们以第一个编号(我)来连接父亲编号、母亲编号、孩子编号,放在一个组
//所以,在一个组里面都是和我有关系的,可以用来算家庭人员总数
int main()
{
int n;
cin>>n;
int visit[10010]={
0};
for(int i=0;i<n;i++){
int id,fid,mid;
cin>>id>>fid>>mid;//6666 5551 5552
visit[id]++;
if(fid!=-1){
visit[fid]++;
Union(fid,id);
}
if(mid!=-1){
visit[mid]++;
Union(mid,id);
}
int k;
cin>>k;
for(int t=0;t<k;t++){
int cid;
cin>>cid;
if(cid!=-1){
visit[cid]++;
Union(cid,id