PAT-L1-020. 帥到沒朋友
阿新 • • 發佈:2019-01-08
並查集···
比賽時緊張···腦抽 沒寫出來···
不過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; }