HDU 1325,POJ 1308 Is It A Tree
Posted 欲儿很轻狂
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 1325,POJ 1308 Is It A Tree相关的知识,希望对你有一定的参考价值。
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的主要内容,如果未能解决你的问题,请参考以下文章