zoukankan      html  css  js  c++  java
  • hihocoder-1322-树结构判定

    hihocoder-1322-树结构判定

    #1322 : 树结构判定

    时间限制:10000ms
    单点时限:1000ms
    内存限制:256MB

    描述

    给定一个包含 N 个顶点 M 条边的无向图 G ,判断 G 是不是一棵树。

    输入

    第一个是一个整数 T ,代表测试数据的组数。 (1 ≤ T ≤ 10)

    每组测试数据第一行包含两个整数 N 和 M 。(2 ≤ N ≤ 500, 1 ≤ M ≤ 100000)

    以下 M 行每行包含两个整数 a 和 b ,表示顶点 a 和顶点 b 之间有一条边。(1 ≤ ab ≤ N)

    输出

    对于每组数据,输出YES或者NO表示 G 是否是一棵树。

    样例输入
    2
    3 2
    3 1
    3 2
    5 5
    3 1
    3 2
    4 5
    1 2
    4 1 
    样例输出
    YES
    NO

    使用dfs进行遍历。

    #include <cstdio> 
    
    #include <cstring>  
    #include <iostream> 
    using namespace std; 
    const int MAXV = 500 + 10; 
    
    int ans, cnt, n, m, mp[MAXV][MAXV], vis[MAXV]; 
    
    void dfs(int pt, int pre){
        if(ans == 0){
            return; 
        }
        for(int i=1; i<=n; ++i){
            if(i == pre){ continue; } 
            if(mp[pt][i] == 1){
                if(vis[i] == 1){
                    ans = 0; 
                    return; 
                }
                ++cnt; 
                vis[i] = 1; 
                dfs(i, pt); 
            }
        }
    }
    
    int main(){
    
        int T, x, y; 
        scanf("%d", &T); 
        while(T--){
            scanf("%d %d", &n, &m); 
            memset(mp, 0, sizeof(mp)); 
    
            for(int i=0; i<m; ++i){
                scanf("%d %d", &x, &y); 
                mp[ x ][ y ] = mp[ y ][ x ] = 1; 
            }
    
            memset(vis, 0, sizeof(vis)); 
            ans = 1;  cnt = 1; 
            vis[1] = 1; 
            dfs(1, -1); 
            if(ans && cnt == n){
                printf("YES
    ");
            }else{
                printf("NO
    ");
            }
        } 
        return 0; 
    }
    

      

    或者使用并查集: 

    #include <cstdio> 
    
    #include <cstring>  
    #include <iostream> 
    using namespace std; 
    const int MAXV = 500 + 10; 
    
    int root[MAXV], vis[MAXV]; 
    
    int Find(int num){
        int r = num; 
        while(r != root[r]){
            r = root[r]; 
        }
        int i = num; 
        while(i != r){
            int j = root[i]; 
            root[i] = r; 
            i = j; 
        }
        return r; 
    }
    
    int main(){
        int T, x, y, xx, yy, ans, n, m;
        int cnt, flag, edge;  
        scanf("%d", &T); 
        while(T--){
            scanf("%d %d", &n, &m); 
    
            for(int i=1; i<=n; ++i){
                root[i] = i; 
            }
    
            memset(vis, 0, sizeof(vis)); 
            cnt = 0; flag = 0; edge = 0; 
            for(int i=0; i<m; ++i){
                scanf("%d %d", &x, &y); 
                if(x == y || flag == 1){
                    flag = 1; 
                    continue; 
                }
                if(vis[x] == 0){
                    vis[x] = 1; ++cnt; 
                }
                if(vis[y] == 0){
                    vis[y] = 1; ++cnt; 
                }
                xx = Find(x); 
                yy = Find(y); 
                if(xx == yy){
                    flag = 1; 
                    continue; 
                }
                root[x] = y; 
                ++edge; 
            }
            if(flag || edge+1 != cnt){
                printf("NO
    ");
            }else{
                printf("YES
    ");
            }
        } 
        return 0; 
    }
    

      

  • 相关阅读:
    四则运算——结对编程
    《构建之法》第4章、第17章阅读与思考
    2016012063 小学四则运算练习软件项目报告
    基于《构建之法》的几个小见解
    结缘软件工程
    散列函数的应用及其安全性
    结对项目作业
    《构建之法》第四章第十七章阅读作业
    2016012048+小学四则运算练习软件项目报告
    读《构建之法》
  • 原文地址:https://www.cnblogs.com/zhang-yd/p/7422565.html
Copyright © 2011-2022 走看看