并查集---wannafly2017-12-15 D

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并查集---wannafly2017-12-15 D相关的知识,希望对你有一定的参考价值。

1、题目

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
给你一个 n 个点,m 条边的无向图,求至少要在这个的基础上加多少条无向边使得任意两个点可达~

输入描述:
第一行两个正整数 n 和 m 。
接下来的m行中,每行两个正整数 i 、 j ,表示点i与点j之间有一条无向道路。
输出描述:
输出一个整数,表示答案
示例1
输入

4 2
1 2
3 4
输出

1
备注:
对于100%的数据,有n,m<=100000。

 

2、分析:给定n个点,则有n-1条边就可以实现任意两点连通,所以用并查集解决,只要两个点之间存在一条无向边,则该店的祖先就发生了变化,这样在最后查询的时候就可以确定最后需要连接几条边(即答案)。res-1是代表防止形成环。

3、Code

#include<bits/stdc++.h>
using namespace std;
const int maxn = 100005;
int fa[maxn];
int n,m;

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

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

void unin(int x, int y)
{
    int fx = find(x);
    int fy = find(y);
    if(fx != fy){
        fa[fx] = fy;
    }
}

int main()
{
    int u,v;

    while(~scanf("%d%d",&n,&m)){
        init();

        for(int i = 0; i < m; i++)
        {
            scanf("%d%d",&u,&v);
            unin(u,v);
        }
        int res = 0;
        for(int i = 1; i <= n; i++)
        {
            if(fa[i] == i)
                res++;
        }
        printf("%d\n",res-1);
    }

    return 0;
}

 

以上是关于并查集---wannafly2017-12-15 D的主要内容,如果未能解决你的问题,请参考以下文章

规律题-----求给定范围内约数的个数 wannafly2017-12-15 A

Wannafly练习赛14

❤️数据结构入门❤️(2 - 5)- 并查集

并查集

并查集并查集专题总结

数据结构----并查集