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. 彩色模型 分类: 图像处理 Matlab 2015-01-08 20:43 364人阅读 评论(0) 收藏

    彩色模型(又称彩色空间或彩色系统)是描述色彩的一种方法,本质上,彩色模型就是坐标系统和子空间的规范,系统中的每种颜色由单个点来表示.下面介绍两种最常用的彩色模型. 一.RGB彩色模型: RGB模型是最 ...

  2. Looper、MessageQueue、Message、Handler的关系

    1.快速复习 1.1 基本装置 类 装置名 作用 线程中数量 Looper 消息分发装置 从消息队列中取出一个消息,交给对应的Handler处理消息. 1 MessageQueue 消息队列 保存所有 ...

  3. 关于Swing中JFrame等顶级容器的层次还有设置背景的方式

    资料来自:http://blog.csdn.net/qq_32006373/article/details/49659129 http://yuncode.net/code/c_5196327caac ...

  4. html5的表单元素总结

  5. vue组件、数据解析的实现思想猜想与实践

    Vue的全局组件,在注册后,可在全局范围内无限次使用,猜想是利用了闭包"可以保持形参"的特性,使初始化时的作用域得意保存,下面用原生js和部分jquery代码模拟了数据解析和组件渲 ...

  6. Vue 学习之el、template、replace和vue的生命周期 参考网址:https://segmentfault.com/a/1190000008010666

  7. Asp.Net中调用存储过程并返回输出参数

    /// <summary> /// 调用存储过程返回参数 /// </summary> /// <param name="orderId">&l ...

  8. .Net Mvc EasyUI DataGrid 分页

    由于项目的需要,最近一直在学习 .net MVC 和EasyUI.上周写了一个<.Net Mvc 返回Json,动态生成EasyUI Tree>,今天再写一个EasyUI中另一个重要的组件 ...

  9. QPushButton注册事件过滤器后按钮消失

    版权声明:本文为博主原创文章,转载需要注明出处. RT,代码如下: ui.btn_set->installEventFilter(this); bool MousrHoverTest::even ...

  10. CSS——BFC

    http://www.cnblogs.com/lhb25/p/inside-block-formatting-ontext.html 元素若不是bfc,那么内部浮动元素的高度不参与计算 元素若不是bf ...