牛客-加边的无向图(思维+并查集)

简介: 牛客-加边的无向图(思维+并查集)

原题链接:更好的阅读体验~

题目描述

给你一个 n 个点,m 条边的无向图,求至少要在这个的基础上加多少条无向边使得任意两个点可达~


输入描述:

第一行两个正整数 n 和 m 。

接下来的m行中,每行两个正整数 i 、 j ,表示点i与点j之间有一条无向道路。

输出描述:

输出一个整数,表示答案

示例1

输入

复制

4 2

1 2

3 4

输出

复制

1

备注:

对于100%的数据,有n,m<=100000。

思路:

给定的m条边不一定能够联通所有点,只需要计算出联通块个数,-1即可。

因为3个区域只需要2条边就可以联通,所以答案是个数-1。

求联通块的话,可以用并查集或dfs

类似的题:传送门

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+7;
///联通块个数-1
int root[maxn],n,m;
int Find(int x){
    if(x!=root[x]) root[x]=Find(root[x]);
    return root[x];
}
void Union(int x,int y){
    x=Find(x),y=Find(y);
    if(x!=y) root[y]=x;
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) root[i]=i;///并查集初始化
    int a,b;
    while(m--){
        scanf("%d%d",&a,&b);
        Union(a,b);
    }
    int num=0;
    for(int i=1;i<=n;i++)
        if(root[i]==i) num++;
    printf("%d\n",num-1);
    return 0;
}

还是很简单的吧~

虽然万事开头难,但是希望题单开头会容易一点

目录
相关文章
牛客刷题之图论-最小生成树
牛客刷题之图论-最小生成树
90 0
牛客刷题之图论-最短路
牛客刷题之图论-最短路
64 0
|
算法 测试技术 C++
C++算法:美丽塔O(n)解法单调栈
C++算法:美丽塔O(n)解法单调栈
数据结构实验之图论四:迷宫探索
数据结构实验之图论四:迷宫探索
|
存储 算法 搜索推荐
蓝桥杯丨分治算法
蓝桥杯丨分治算法
75 0
每日刷题|回溯法解决组合问题
每日刷题|回溯法解决组合问题
|
存储
广度优先搜索练习感想
广度优先搜索练习感想
【牛客】二叉树遍历
【牛客】二叉树遍历
59 0
|
机器学习/深度学习 C++
【力扣·每日一题】1036. 逃离大迷宫 (C++ bfs 思维)
【力扣·每日一题】1036. 逃离大迷宫 (C++ bfs 思维)
98 0
【力扣·每日一题】1036. 逃离大迷宫 (C++ bfs 思维)
|
C++
这道「岛屿题」用并查集做就体现出其威力了!
之前的岛屿题,用 DFS 和 BFS 来做要比用并查集更加好做并且高效,但是最对这一道题来说,用并查集要更加好做。
107 0