Is It A Tree?
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 28838   Accepted: 9843

->  Link  poj  <-

->  Link 
hdu<-

->  Link 
NYoj <-

这三个题题目都是一样的,我先做的NYOJ上的,以-1、-1结尾,然后跑到HDu上交一遍跪了,改成同时小于0就A了, 又到POJ上交一遍又跪了,改成-1、-1结尾又A了;

题意:给你一些点对x,y,每组以0 0结尾,最后以-1、-1或一对负数结束,y表示被指向的点;也就是说两点之间是一条单向边;然后给出树的定义,判断是否为合法树:

|

\/

There is exactly one node, called the root, to which no directed edges point. //只有一个根节点(无被指向的边,入度为0);

     Every node except the root has exactly one edge pointing to it. //入度为1

     There is a unique sequence of directed edges from the root to each node. //无环也就是路径唯一,这里和小希的迷宫那题有点类似;

思路:典型并查集题,既然给出了这三个条件,那么我们就从这条件出发;用一个vis[]数组来存入度(被指向的节点入度++,即vis[y]++),所有节点的入度都小于2(这里知道怎么判断了吧);那么怎么判断路径唯一呢,我们可以发现,如果入度大于等于2或者指向自己都是会成环的,所以在合并的时候判断两节点是否联通,若已经联通这条边必然无用(这里也判断一下);最后我们找是否只有一个根节点,注意除根节点外合法树其他点入度都为1,所以我们遍历一遍所有的点看其入度情况;

几个特殊样例注意一下:

0 0代表空树,也是合法的;

1 1 0 0不合法,自己指向自己;

注意如果不连通不合法;

using namespace std;
const int N=100000+10;
int v[N],f[N],a[N];//v[]用来存节点入度,a[]用来存点;
int find(int x)
{
return f[x]==-1?x:f[x]=find(f[x]);
}
int main()
{
int x,y,i=0,t=1;
while(~scanf("%d%d",&x,&y)&&x!=-1&&y!=-1)//HDu这里只需改成同时小于0就行;
{
if(x==0&&y==0)//空树;
{
printf("Case %d is a tree.\n",t++);
continue;
}
int ff=0,k=0;
memset(f,-1,sizeof(f));
memset(a,0,sizeof(a));
memset(v,0,sizeof(v));
int xx=find(x);
int yy=find(y);
if(xx!=yy)
f[xx]=yy;
else
ff=1;
a[k++]=x,a[k++]=y;//存点;
v[y]++;
for(i=1;; i++)
{
scanf("%d%d",&x,&y);
if(x==0&&y==0) break;
int xx=find(x);
int yy=find(y);
if(xx!=yy)
f[xx]=yy;
else
ff=1;//自己指向自己或有多条路到达某个点;
a[k++]=x,a[k++]=y;
v[y]++;
if(v[y]>1) ff=1;//除根节点每个节点只有一条被指向边,入度为1;
}
if(ff) printf("Case %d is not a tree.\n",t++);
else
{
sort(a,a+k);
int kk=unique(a,a+k)-a;//不同的点;
for(i=0;i<kk;i++)//数组a[]的作用在于此;
if(v[a[i]]!=1)//判断入度不为1的点有几个,合法树只有根节点不为1;
ff++;
if(ff!=1)
printf("Case %d is not a tree.\n",t++);
else
printf("Case %d is a tree.\n",t++);
}
}
return 0;
}

POJ1308/HDU1325/NYOJ129-Is It A Tree?,并查集!的更多相关文章

  1. Hdu.1325.Is It A Tree?(并查集)

    Is It A Tree? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  2. Is It A Tree?(并查集)

    Is It A Tree? Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 26002   Accepted: 8879 De ...

  3. CF109 C. Lucky Tree 并查集

    Petya loves lucky numbers. We all know that lucky numbers are the positive integers whose decimal re ...

  4. HDU 5606 tree 并查集

    tree 把每条边权是1的边断开,发现每个点离他最近的点个数就是他所在的连通块大小. 开一个并查集,每次读到边权是0的边就合并.最后Ans​i​​=size[findset(i)],size表示每个并 ...

  5. [Swust OJ 856]--Huge Tree(并查集)

    题目链接:http://acm.swust.edu.cn/problem/856/ Time limit(ms): 1000 Memory limit(kb): 10000 Description T ...

  6. Codeforces Round #363 (Div. 2)D. Fix a Tree(并查集)

    D. Fix a Tree time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  7. Is It A Tree?(并查集)(dfs也可以解决)

    Is It A Tree? Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submi ...

  8. tree(并查集)

    tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submis ...

  9. 树上统计treecnt(dsu on tree 并查集 正难则反)

    题目链接 dalao们怎么都写的线段树合并啊.. dsu跑的好慢. \(Description\) 给定一棵\(n(n\leq 10^5)\)个点的树. 定义\(Tree[L,R]\)表示为了使得\( ...

  10. hdu 1325 Is It A Tree? 并查集

    Is It A Tree? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

随机推荐

  1. LoadRunner12学习之路(6-8)

    六.创建负载测试场景 如何启动控制器? 要开始开发场景,请打开LoadRunner Controller. 打开HPE LoadRunner Controller. 在LoadRunner机器上,单击 ...

  2. Vue自定义过滤器格式化数字三位加一逗号

    <template> <div class="index-compont"> <div class="totalCount"> ...

  3. AJPFX:递归与非递归之间的转化

    在常规表达式求值中: 输入为四则运算表达式,仅由数字.+.-.*./ .(.) 组成,没有空格,要求求其值. 我们知道有运算等级,从左至右,括号里面的先运算,其次是* ./,再是+.- : 这样我们就 ...

  4. ie浏览器和火狐浏览器对对容器宽度定义的差异

    首先我们说说firefox和IE对CSS的宽度显示有什么不同: 其实CSS ’width’ 指的是标准CSS中所指的width的宽度,在firefox中的宽度就是这个宽度.它只包含容器中内容的宽度.而 ...

  5. Spring------IOC&DI

    一.Spring? Spring兴起:2003年,由Rod Johnson创建.总的来说,Spring Framwork从它诞生至今都一直为人所称道,它的伟大之处自此可见一斑. 核心:IOC& ...

  6. mysql 字段包含某个字符的函数

    通过sql查询语句,查询某个字段中包含特定字符串: 例子:查询e_book表的types字段包含字符串"3",有下面4种方式 select * from e_book where ...

  7. mysql 判断null 和 空字符串

    1.在mysql中null 不能使用任何运算符与其他字段或者变量(函数.存储过程)进行运算.若使用运算数据就可能会有问题. 2.对null 的判断: 创建一个user表:id 主健 name 可以为空 ...

  8. iOS Programming Camera 2

    iOS Programming Camera  2  1.1 Creating BNRImageStore The image store will fetch and cache the image ...

  9. IIS ARR设置HTTP跳转到HTTPS

    GUI Version - Select the website you wish to configure- In the “Features View” panel, double click U ...

  10. spring 中文乱码问题

    spring 开发过程中的中文乱码问题主要分为以下几种: 1.前端传参数到后台前  就已经乱码. 这个很大原因就是前端的问题了! 2.传入后台后,乱码. 可能存在几个原因: 2.1 传入tomcat前 ...