1. 程式人生 > >ACM模板——無向圖連通判斷法(或求連通分支個數)

ACM模板——無向圖連通判斷法(或求連通分支個數)

#include<bits/stdc++.h>
#include<cmath>

#define mem(a,b) memset(a,b,sizeof a);
#define INF 0x3f3f3f3f

using namespace std;

typedef long long ll;

const int maxn=1010;

int n,m;
int pre[maxn];

void init()
{
    for(int i=1;i<=n;i++) pre[i]=i;
}

int find(int x)
{
    return pre[x]==x?x:pre[x]=find(pre[x]);
}

int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        init();
        int u,v;
        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&u,&v);
            pre[find(u)]=pre[find(v)]; // 合併為同一個根
        }

        int cnt=0;
        for(int i=1;i<=n;i++) // 統計 root 結點個數
            if(pre[i]==i)
            {
                cnt++;
                if(cnt>1) break;
            }

        puts(cnt==1?"YES":"NO");
    }

    return 0;
}