zoukankan      html  css  js  c++  java
  • hihoCoder#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

    思路:判定是否为树的2个充要条件:①边的数目等于结点数-1 ②图连通(并查集只有一个根)
    #include <iostream>
    #include <string.h>
    using namespace std;
    const int MAXN=505;
    int n,m;
    int par[MAXN];
    void prep()
    {
        for(int i=0;i<MAXN;i++)
        {
            par[i]=i;
        }
    }
    int fnd(int x)
    {
        if(x==par[x])
        {
            return x;
        }
        return par[x]=fnd(par[x]);
    }
    void unite(int x,int y)
    {
        int a=fnd(x);
        int b=fnd(y);
        par[a]=b;
    }
    int main()
    {
        int T;
        cin>>T;
        while(T--)
        {
            prep();
            cin>>n>>m;
            for(int i=0;i<m;i++)
            {
                int x,y;
                cin>>x>>y;
                unite(x,y);
            }
            int root=-1;
            int cnt=0;
            for(int i=1;i<=n;i++)
            {
                int fa=fnd(i);
                if(fa!=root)
                {
                    root=fa;
                    cnt++;
                }
            }
            if(n-1==m&&cnt==1)
            {
                cout<<"YES"<<endl;
            }
            else
            {
                cout<<"NO"<<endl;
            }
        }
        return 0;
    }
  • 相关阅读:
    Day 37 数据库初识
    Day 36 socket并发,协程,进程池与线程池
    Day 35 GIL全局解释器锁,死锁与递归锁,信号量,event事件,线程queue
    DAY 34 进程通信、消费者模型和线程
    09-盒模型
    08-层叠性权重相同处理
    07-css的继承性和层叠性
    06-伪元素选择器
    05-伪类选择器
    04-属性选择器
  • 原文地址:https://www.cnblogs.com/program-ccc/p/5729804.html
Copyright © 2011-2022 走看看