码迷,mamicode.com
首页 > 其他好文 > 详细

ouc 1059

时间:2014-11-16 10:29:22      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:blog   http   io   ar   os   使用   sp   for   数据   

1059: 树判断

时间限制: 1 Sec  内存限制: 64 MB
提交: 77  解决: 16
[提交][状态][讨论版]

题目描述

        树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样。树(tree)是包含n(0<=n<=1000)个结点的有穷集合,其中:  


        (1)每个元素称为结点(node);   
        (2)有一个特定的结点被称为根结点或树根(root);  
        (3)除根结点之外的其余数据元素被分为m(m≥0)个互不相交的结合T1,T2,……,Tm-1,其中每一个集合Ti(1<=i<=m)本身也是一棵树,被称作原树的子树(subtree)。  

        树形结构示例如下图,圆表示节点,节点(1<=节点序号<=1000)之间的连线表示边,下图中前面的两个是树形结构,第3个不是。

 

bubuko.com,布布扣

 

 

输入

输入包含多个测试样例,每个样例使用一对数字表示两个有边的节点,如果两个节点为0表示样例结束。-1 -1 表示全部测试样例结束。

 

输出

每个测试样例输出 "Case k is a tree." 或者 "Case k is not a tree.",k 对应于测试样例的序号 。

 

样例输入

6 8
5 3
5 2
6 4
5 6
0 0

3 8
6 8
6 4
5 3
5 6
5 2
0 0

-1 -1

样例输出

Case 1 is a tree.
Case 2 is not a tree.

提示

 

来源

第二届“朗讯杯”高级组

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<vector>
int x,y,set[100010],flag,cas,rt;
int find(int x)
{
return x==set[x]?x:set[x]=find(set[x]);
}
void Union(int x,int y)
{
int ux,uy;
ux=find(x),uy=find(y);
if(ux!=uy)
set[ux]=uy;
}

int main()
{
cas=0;
while(1)
{
flag=1,rt=0;
cas++;
memset(set,0,sizeof(set));
while(scanf("%d%d",&x,&y)&&x!=0&&y!=0)
{
if(x==-1&&y==-1) return 0;
if(set[x]==0) set[x]=x;
if(set[y]==0) set[y]=y;
if(find(x)==find(y)) flag=0;
else if(flag) Union(x,y);
}
for(int i=1;i<=100000;i++)
if(set[i]==i)
rt++;
if(rt>1||!flag)
printf("Case %d is not a tree.\n",cas);
else
printf("Case %d is a tree.\n",cas);
}
}

  

ouc 1059

标签:blog   http   io   ar   os   使用   sp   for   数据   

原文地址:http://www.cnblogs.com/a972290869/p/4101070.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!