连通图(暑假每日一题 21)

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

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

每组数据第一行包含两个整数 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, 1n1000,
1 ≤ m ≤ 5000 , 1≤m≤5000, 1m5000,
1 ≤ x , y ≤ n 1≤x,y≤n 1x,yn

输入样例:

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;
}

猜你喜欢

转载自blog.csdn.net/qq_46456049/article/details/126279279
21
21)