ZOJ-1268

4 篇文章 0 订阅

判断是否树,输入数据里面边界条件超多。。反正,觉得没测试数据的肯定过不了。。对着数据改了N次代码才过,要考虑图里一个点也没有,图里有环,自环,两条相同边等等特殊情况不一而足。。数据地址 http://www.ntnu.edu.tw/acm/ProblemSetArchive/B_US_NorthCen/1997/index.html

#include<cstdio>
#include<map>
#include<set>

using namespace std;

namespace
{
	set<int> S;

	int find_root(map<int, int> &M, int node)
	{
		if (S.find(node) != S.end())
			return -1;

		if (M.find(node) != M.end())
		{
			S.insert(node);
			return find_root(M, M[node]);
		}
		return node;
	}
}

int main()
{
	int from, to, cs = 0;
	map<int, int> M;
	while (scanf("%d%d", &from, &to), from != -1 && to != -1)
	{
		M.clear();
		M[to] = from;
		bool tree = true;
		if (!from && !to)
		{
			printf("Case %d is a tree.\n", ++cs);
			continue;
		}
		if (to == from)
			tree = false;

		while (scanf("%d%d", &from, &to), from || to)
		{
			if (tree)
			{
				if (M.find(to) != M.end() || to == from)
				{
					tree = false;
					continue;
				}
				M[to] = from;
			}
		}

		if (tree)
		{
			int root = -1;
			for (map<int, int>::iterator it = M.begin(); it != M.end(); it++)
			{
				S.clear();
				int temp = find_root(M, (*it).second);
				if (temp == -1)
				{
					tree = false;
					break;
				}

				if (root == -1)
					root = temp;
				else if (root != temp)
				{
					tree = false;
					break;
				}
			}
		}
		printf("Case %d is %sa tree.\n", ++cs, tree ? "" : "not ");
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值