判断是否树,输入数据里面边界条件超多。。反正,觉得没测试数据的肯定过不了。。对着数据改了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;
}