基礎実験4から2.8部族(25ポイント)
誰もが自分自身の小さな円を持っているコミュニティで、また友人の多くの異なったサークルに属していてもよいです。私たちは、友人の友人はとてもエンドどのように多くのばらばらの部族では、与えられた社会で、統計を見てお聞きし、部族でカウントされていることを信じますか?そして、任意の二人は同じ部族に属しているかどうかを確認します。
入力フォーマット:
任意の正の整数N(最初の行の≤10入力
4
)、既知の小円の数。次いで、N行、各行は、次の形式の人々の小集団が与えられます。
KP [1]〜P [2]⋯P [K]
Kは、内側の円の数であり、P [i]は(iは= 1、⋯、K)は、 各小円の数です。ここで、すべての連続1から始まる番号の番号、最大数は10超えない
4
。
ラインはQ(≦10の整数非負与えられた後
。4
)、クエリの数です。そして、Qラインは、それぞれの行は、カップルを照会している人の数を示します。
出力フォーマット:
まず、出力の合計数このコミュニティだけでなく、行の互いに素部族の数。各クエリに対して、それらは同じ部族に属している場合、行の出力Y、そうでなければ出力N.
サンプル入力:
4
。3. 1 10 2
2 4 3
。4. 5. 1. 7 8
3 4 9 6
2
10 5
。3. 7
出力サンプル:
10 2
Y
N
ACコード:
#include<iostream>
#include<set>
#include<stdio.h>
using namespace std;
int p[10001];
int find(int x);
int main(){
set<int>s1,s2;
for(int i=0;i<10001;i++){
p[i]=i;
}
int n1,n2,n3,x,y,root1,root2;
cin>>n1;
for(int i=1;i<=n1;i++){
cin>>n2>>x;
root1=find(x);
s1.insert(x);
//printf("%d: %d\n",++cnt,x);
for(int j=1;j<=n2-1;j++){
cin>>y;
root2=find(y);
if(root1!=root2){
p[root2]=root1;
}
s1.insert(y);//printf("%d: %d\n",++cnt,y);
}
//scanf("\n");
}
int size1=static_cast<int>(s1.size());
for(int i=1;i<=size1;i++){
s2.insert(find(i));
}
int size2=static_cast<int>(s2.size());
/*set<int>::iterator itr1,itr2;
for(itr1=s1.begin();itr1!=s1.end();itr1++){
cout<<*itr1<<" ";
}*/
cout<<size1<<" "<<size2<<endl;
cin>>n3;int a1,a2,left,right;
for(int i=0;i<n3;i++){
cin>>a1>>a2;
left=find(a1);
right=find(a2);
if(left==right){
cout<<"Y"<<endl;
}else cout<<"N"<<endl;
}
}
int find(int x){
if(x==p[x]){
return x;
}else
return p[x]=find(p[x]);
}