版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wind528/article/details/88528647
原题链接
题目分析
- 题意为
判断无向图是否连通
亦等价为找出无向图的连通分量的个数
,如果只有一个连通分量,即该无向图连通。dfs
和bfs
都能实现,但个人觉得并查集
更方便一些。- 先初始化
tree
数组,使用fill
或者fill_n
初始化可以使初始值为任意值,memset
更适合初始化为0
。注意点是从1到n
计算,所以数组初始化要初始化到n+1
,这里WA了。- 并查集具体实现看代码。
代码实现
/**
判断无向图是否连通 → 并查集
*/
#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;
}