题意,就是判断这点点是不是组成的一颗树,也就是判断是否有环,就是没看出来如果是森林怎么办,试一试吧,最可恶的还没有说有多少节点。。。。。就是个坑
//////////////////////////////////////////////////////////////////
坑,这题就是一个彻头彻尾的坑,首先数据不连接,需要一个标记数组来判断出现的都是那些节点,数组要开到10w,而且还有可能这棵树没有节点,是一个空树,也就是只有 0 0,还要判断是不是森林,要输出这也是一颗树.....确实很无聊的题目,需要让人试错
#include <stdio.h>
#include<algorithm>
using namespace std;
const int maxn = 100005;
int f[maxn], use[maxn];
void init()
{
for(int i=0; i<maxn; i++)
f[i] = i, use[i] = 0;
}
int Find(int x)
{
if(f[x] != x)
f[x] = Find(f[x]);
return f[x];
}
int main()
{
int u, v, ok=1, t=1;
init();
while(scanf("%d%d", &u, &v), u!= -1 || v!=-1)
{
if(u+v == 0)
{
int sum = 0;
for(int i=0; i<maxn; i++)
{
if(use[i] == 1 && f[i] == i)
sum++;
}
if(ok && sum < 2)printf("Case %d is a tree. ", t++);
else printf("Case %d is not a tree. ", t++);
ok = 1;
init();
}
else
{
use[u] = use[v] = 1;
u = Find(u), v = Find(v);
if(u != v)
f[u] = v;
else ok = 0;
}
}
return 0;
}
using namespace std;
const int maxn = 100005;
int f[maxn], use[maxn];
void init()
{
for(int i=0; i<maxn; i++)
f[i] = i, use[i] = 0;
}
int Find(int x)
{
if(f[x] != x)
f[x] = Find(f[x]);
return f[x];
}
int main()
{
int u, v, ok=1, t=1;
init();
while(scanf("%d%d", &u, &v), u!= -1 || v!=-1)
{
if(u+v == 0)
{
int sum = 0;
for(int i=0; i<maxn; i++)
{
if(use[i] == 1 && f[i] == i)
sum++;
}
if(ok && sum < 2)printf("Case %d is a tree. ", t++);
else printf("Case %d is not a tree. ", t++);
ok = 1;
init();
}
else
{
use[u] = use[v] = 1;
u = Find(u), v = Find(v);
if(u != v)
f[u] = v;
else ok = 0;
}
}
return 0;
}