您的位置:首页 > 其它

[hihocoder1322] 树结构判定

2017-08-16 12:59 190 查看
这是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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hiho刷题日记