首页 > 代码库 > ouc 1059
ouc 1059
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个不是。
输入
输入包含多个测试样例,每个样例使用一对数字表示两个有边的节点,如果两个节点为0表示样例结束。-1 -1 表示全部测试样例结束。
输出
每个测试样例输出 "Case k is a tree." 或者 "Case k is not a tree.",k 对应于测试样例的序号 。
样例输入
6 85 35 26 45 60 03 86 86 45 35 65 20 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);elseprintf("Case %d is a tree.\n",cas);}}
ouc 1059
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。