[hihocoder1322] 树结构判定

这是hiho一下 第161周的题目


题目描述

时间限制: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 ≤ a, b ≤ 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

算法简介

首先通过M==N-1做树判断。
然后深度优先搜索,判断是否存在回路,存在回路则非树。
最后遍历所有节点,判断是否有节点没有被访问。

犯错误的部分:因为是无向边,所以添加的时候需要在两个节点都添加;而使用过边之后,需要两个方向的边都删除。

代码

#include <iostream>
#include <list>

using namespace std;

struct Node {
    list<int> next;
};

int N,M,a,b;
bool flag[502];

bool test(Node* nodes,int s) {
    if (flag[s])
        return false;
    flag[s] = true;
    for (list<int>::iterator iter = nodes[s].next.begin();iter != nodes[s].next.end();++iter) {
        nodes[*iter].next.remove(s);
        if (!test(nodes,*iter))
            return false;
    }
    return true;
}

bool deter() {
    cin >> N >> M;
    if (M != N-1) {
        for (int i = 0;i < M;++i)
            cin >> a >> b;
        return false;
    }
    Node nodes[502];
    for (int i = 0;i < M;++i) {
        cin >> a >> b;
        nodes[a-1].next.push_front(b-1);
        nodes[b-1].next.push_front(a-1);
    }
    for (int i = 0;i < N;++i)
        flag[i] = false;
    if (!test(nodes,0))
        return false;
    for (int i = 0;i < N;++i)
        if (!flag[i])
            return false;
    return true;
}

int main()
{
    int T;
    cin >> T;
    for (int i = 0;i < T;++i)
        cout << ((deter())?"YES":"NO") << endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值