给定一个无向图和其中的所有边,判断这个图是否所有顶点都是连通的。
输入格式
输入包含若干组数据。
每组数据第一行包含两个整数 n n n 和 m m m,表示无向图的点和边数。
接下来 m m m 行,每行包含两个整数 x , y x,y x,y,表示点 x x x 和点 y y y 相连。
点的编号从 1 1 1 到 n n n。
图中可能存在重边和自环。
输出格式
每组数据输出一行,一个结果,如果所有顶点都是连通的,输出 YES
,否则输出 NO
。
数据范围
输入最多包含 10 10 10 组数据。
1 ≤ n ≤ 1000 , 1≤n≤1000, 1≤n≤1000,
1 ≤ m ≤ 5000 , 1≤m≤5000, 1≤m≤5000,
1 ≤ x , y ≤ n 1≤x,y≤n 1≤x,y≤n
输入样例:
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;
}