题目https://www.acwing.com/problem/content/3590/
目录
给定一个无向图和其中的所有边,判断这个图是否所有顶点都是连通的。
输入格式
输入包含若干组数据。
每组数据第一行包含两个整数 n 和 m,表示无向图的点和边数。
接下来 m 行,每行包含两个整数 x,y,表示点 x 和点 y 相连。
点的编号从 1 到 n。
不保证没有重边和自环。
输出格式
每组数据输出一行,一个结果,如果所有顶点都是连通的,输出
YES
,否则输出NO
。
数据范围
输入最多包含 10 组数据。
1≤n≤1000,
1≤m≤5000,
1≤x,y≤n
输入样例:
4 3
1 2
2 3
3 2
3 2
1 2
2 3
输出样例:
NO
YES
Answer1(bfs):
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxx=1009;
vector<int> v[maxx];
int vis[maxx],num;
void bfs()
{
memset(vis,0,sizeof(vis));
num=1;
queue<int> q;
q.push(1);
vis[1]=1;
while(!q.empty())
{
int tp=q.front();
q.pop();
for(int i=0;i<v[tp].size();i++)
{
if(!vis[v[tp][i]])
{
num++;
vis[v[tp][i]]=1;
q.push(v[tp][i]);
}
}
}
}
int main()
{
// freopen("input.txt","r",stdin);
int n,m,x,y;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=1; i<=m; i++)
{
scanf("%d%d",&x,&y);
v[x].push_back(y);
v[y].push_back(x);
}
bfs();
printf("%s\n",num==n ? "YES":"NO");
for(int i=1;i<=n;i++)
v[i].clear();
}
return 0;
}
Answer2(并查集):
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxx=1009;
int f[maxx];
int findd(int x)
{
return f[x]==x ? x: f[x]=findd(f[x]);
}
int main()
{
// freopen("input.txt","r",stdin);
int n,m,x,y;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=1;i<=n;i++)
f[i]=i;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
f[findd(x)]=findd(y);
}
int num=0;
for(int i=1;i<=n;i++)
if(f[i]==i)
num++;
printf("%s\n",num==1 ? "YES":"NO");
}
return 0;
}