J. 图的连通性问题-并查集

Input

本问题有多组测试数据,每组测试数据有两部分,第一部分只有一行,是两个正整数,分别表示图的节点数N(节点编号从1到N,1<=N<=100)和图的边数E;第二部分共有E行,每行也是两个整数N1,N2(1<=N1,N2<=N),分别表示N1和N2之间有一条边。

Output

对于每一组测试数据,输出只有一行,如果是连通图,那么输出“Yes”,否则输出“No”。

Sample Input

6 10
1 2
1 3
1 4
1 5
1 6
2 3
2 4
3 4
3 5
3 6
4 3
1 2
1 3
2 3

Sample Output

Yes
No
#include <bits/stdc++.h>

using namespace std;
int a[101];
int searchfa(int x);
int main()
{
    int n,s;
    while(cin>>n>>s)
    {
        int cnt=0,f;
        for(int i=1;i<=n;i++)
        {
            a[i]=i;
        }
        for(int i=1;i<=s;i++)
        {
            int p1,p2;
            cin>>p1>>p2;
            int p1f,p2f;
            p1f=searchfa(p1);
            p2f=searchfa(p2);
            a[p2f]=p1f;
        }
        for(int i=1;i<=n;i++)
        {
            if(a[i]==i)
                cnt++;
        }
        if(cnt==1)
            cout<<"Yes"<<endl;
        else
            cout<<"No"<<endl;

    }
    return 0;
}
int searchfa(int x)
{
    if(x==a[x])
        return x;
    else
        return searchfa(a[x]);
}

 

posted @ 2020-06-30 20:42  Cuiiiii  阅读(147)  评论(0)    收藏  举报