给定一个无向图和其中的所有边,判断这个图是否所有顶点都是连通的。

输入格式
输入包含若干组数据。

每组数据第一行包含两个整数 连通图(暑假每日一题 21)_并查集连通图(暑假每日一题 21)_i++_02,表示无向图的点和边数。

接下来 连通图(暑假每日一题 21)_i++_02 行,每行包含两个整数 连通图(暑假每日一题 21)_BFS_04,表示点 连通图(暑假每日一题 21)_并查集_05 和点 连通图(暑假每日一题 21)_i++_06

点的编号从 连通图(暑假每日一题 21)_BFS_07连通图(暑假每日一题 21)_并查集

图中可能存在重边和自环。

输出格式
每组数据输出一行,一个结果,如果所有顶点都是连通的,输出 ​​​YES​​​,否则输出 ​​NO​​。

数据范围
输入最多包含 连通图(暑假每日一题 21)_并查集_09 组数据。
连通图(暑假每日一题 21)_并查集_10
连通图(暑假每日一题 21)_i++_11
连通图(暑假每日一题 21)_DFS_12

输入样例:

4 3
1 2
2 3
3 2
3 2
1 2
2 3

输出样例:

NO
YES

#include<iostream>
#include<cstring>

using namespace std;

const int N = 1010;

int n, m;
bool g[N][N], st[N];

void dfs(int u){

st[u] = true;
for(int i = 1; i <= n; i++)
if(!st[i] && g[u][i])
dfs(i);
}

int main(){

while (cin >> n >> m){

memset(g, 0, sizeof g);
memset(st, 0, sizeof st);

int a, b;
for(int i = 0; i < m; i++)
cin >> a >> b, g[a][b] = g[b][a] = true;

int cnt = 0;
for(int i = 1; i <= n; i++){

if(!st[i]) {
cnt++;
if(cnt > 1) break;
dfs(i);
}
}

if(cnt > 1) puts("NO");
else puts("YES");
}

return 0;
}