EOJ 1816连通(并查集)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wind528/article/details/88528647

原题链接


题目分析

  1. 题意为判断无向图是否连通 亦等价为 找出无向图的连通分量的个数,如果只有一个连通分量,即该无向图连通。
  2. dfsbfs都能实现,但个人觉得并查集更方便一些。
  3. 先初始化tree数组,使用fill或者fill_n初始化可以使初始值为任意值,memset更适合初始化为0。注意点是从1到n计算,所以数组初始化要初始化到n+1,这里WA了。
  4. 并查集具体实现看代码。

代码实现

/** 
判断无向图是否连通 → 并查集
*/
#include<bits/stdc++.h>
using namespace std;
#define N 1000000
int tree[N];
int findRoot(int x)
{
    if(tree[x] == -1)
        return x;
    else
        return tree[x] = findRoot(tree[x]);
}
int main()
{
    int n, m;
    int u, v;
    scanf("%d %d",&n, &m); //n个点m个输入
    fill(tree, tree+n+1, -1);//初始化tree数组0到n+1下标的值为-1
    while(m--)
    {
        scanf("%d %d", &u, &v);
        u = findRoot(u);
        v = findRoot(v);
        if( u != v )  //这两个点是否在同一个集合里
            tree[u] = v;  //不在集合里就放进去
    }
    int ans = 0;
    for(int i = 1; i <= n; i++)
    {
        if(tree[i] == -1)
            ans++;
    }
    //只有一个根节点即为连通
    if(ans == 1)
        printf("yes\n");
    else
        printf("no\n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/wind528/article/details/88528647