---基礎実験と(ファイル転送を含む)4から2.8の部族を見つけます

基礎実験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]);
}

发布了65 篇原创文章 · 获赞 0 · 访问量 1283

おすすめ

転載: blog.csdn.net/hellobettershero/article/details/104422874
おすすめ