HDU认为1>2,3>2不是树,POJ认为是,
而Virtual Judge上引用的是POJ数据
这就是唯一的区别....(因为这个瞎折腾了半天)
此题因为是为了熟悉并查集而刷,其实想了下其实好好利用sort应该能更简单A掉,下次有空再去试试...
题目大意:判断是否为树,so:
1,无环;
2,除了根,所有的入度为1,根入度为0;
3,这个结构只有一个根,不然是森林了;
4.空树也是树,即第一次输入的两个数字为0 0则是树,其他时候输入只是结束条件
因为POJ和HDU题面一样,要求不一样,所以这题解法唯一区别就是
HDU上用所有节点的总父节点唯一判断,而POJ则每输入两个数,判
断他们总父节点是否相等,相等则成环了.
hdu AC代码:http://paste.ubuntu.com/25081598/
POJ AC代码:http://paste.ubuntu.com/25081600/
下面贴的是POJ上AC的代码:
//Is It A Tree?
#include<stdio.h>
#include<cmath>
#include<string.h>
#include<iostream>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
#define maxn 1005
int pre[maxn],visB[maxn],root,vis[maxn],MAX,flag=0;
void iint()
{
for(int i=0; i<=maxn; i++)
{
pre[i]=i;
visB[i]=0;
vis[i]=0;
}
MAX=0; flag=0;
}
int find(int x)
{
return x==pre[x]?x:find(pre[x]);
}
void join(int x,int y)
{
int fx=find(x),fy=find(y);
if(fx!=fy) pre[fx]=fy;
}
int main()
{
int a,b,Case=1/*,real_flag1=0*/,FLAG=0;
iint();
while(~scanf("%d%d",&a,&b),a>=0&&b>=0)
{
if(a==0&&b==0&&flag==0)
{ //空树也是树
printf("Case %d is a tree.\n",Case++);
iint();
continue;
}
flag=1;
visB[b]++;
vis[a]=vis[b]=1;
MAX=max(MAX,a); MAX=max(MAX,b);
/*for(int i=1; i<=MAX; i++)
{
if(vis[i]&&visB[i]>1) real_flag1=1;
//判断根节点是否都有且只有一次,或者说父节点只有一个
if(vis[i]&&visB[i]==0) real_flag2++;
//非环时,最高父节点不会被指向,所以不被指的有且只有1个
//POJ会WA可能是,如3->1 2->1都算一个树了,2333
}*/
/*if(real_flag1) FLAG=1;*/ //天真
if(find(a)==find(b)&&a!=0&&b!=0) FLAG=1;
记住:1->2 ,3->2时候也是树,所以判断是否为环,直接在每次读 入两个数字时候看它们的最高父节点是否相等,相等泽成环,比如
1->2,2->3,3>1.
join(a,b);
if(a==0&&b==0)
{
int ans=0;
for(int i=1; i<=MAX; i++)
if(vis[i]&&pre[i]==i) ans++;
if(ans!=1||FLAG) printf("Case %d is not a tree.\n",Case++);
else printf("Case %d is a tree.\n",Case++);
iint();
/*real_flag1=0;*/ FLAG=0;
continue;
}
}
return 0;
}
HDU 1325,POJ 1308 Is It A Tree
原文:http://www.cnblogs.com/weimeiyuer/p/7162605.html