并查集···
比赛时紧张···脑抽 没写出来···
不过15分的题····他们说不用并查集也能AC···
好吧···
我的思路:查询该点ID时判断 他的前驱结点Par[ID}是否为其本身并且他的孩子数为1(初始化本人为该ID的一个孩子)
那么可以判断 他没有朋友圈或者他是个自恋狂(朋友圈只有他一人)····
#include<cstdio>
#include<cstring>
#include<vector>
#include<iostream>
using namespace std;
const int Size = 100000;
int Par[Size];
int Visited[Size];
int Child[Size];
int Get_Par(int a){
if( Par[a]!=a )
return Par[a]=Get_Par(Par[a]);
return Par[a];
}
void Merge(int a,int b){
int ParA=Get_Par(a);
int ParB=Get_Par(b);
Par[ParA]=ParB;
Child[ParB]+=Child[ParA];
//cout<<a<<"'s father is "<<Get_Par(a)<<" "<<b<<"'s father is"<<Get_Par(b)<<endl;
}
int main()
{
int N;int k;int T;
int ID;
cin>>N;
for(int i=0; i<Size; i++){
Par[i]=i;
Child[i]=1;
}
memset(Visited,0,sizeof(Visited));
//memset(Child,0,sizeof(Child));
while(N--){
cin>>k;
cin>>T;k--;
while(k--){
cin>>ID;
Merge(T,ID);
}
//cout<<T<<"'s child is "<<Child[T]<<endl;
//cout<<ID<<"'s child is "<<Child[ID]<<endl;
}
int M;
cin>>M;
vector<int>Vec;
while(M--){
cin>>T;
int ParT=Get_Par(T);
if(!Visited[T]){
Visited[T]=1;
if(ParT==T&&Child[T]==1){
Vec.push_back(T);
}
}
}
if(Vec.size()){
for(int i=0; i<Vec.size(); i++){
if(i)
printf(" %05d",Vec[i]);
else
printf("%05d",Vec[i]);
}
}
else
cout<<"No one is handsome"<<endl;
}