(1374): 这是一棵树吗?
来源:互联网 发布:vmware共享mac文件夹 编辑:程序博客网 时间:2024/05/17 23:56
题目描述
树是一种重要的数据结构。它要么为空,要么是一个或多个顶点的集合,这些顶点由有向边连结,并且具有如下性质: (1) 有且仅有1个结点,称为“根”。根结点没有边指向它; (2) 除根结点,每个结点仅有一条边指向它; (3) 从根到每个结点仅有一条唯一的路径。 例如,下面三个图中,第一、二个表示的是树,第三个不是。 给出顶点和有向边的信息,编一个程序判断这是一棵树吗?
输入
输入包含多组数据,每组数据格式为: 多组空格分开的整数对,每个整数对j, k(1≤j, k≤10000) 表示一条有向边从结点j指向结点k。两个空格分开的0,表示一组数据的结束。 最后一组数据后的两个空格分开的-1,表示所有输入数据的结束
输出
每组测试数据单独输出一行,输出"Case k is a tree." 或者 "Case k is not a tree." ,这里的k表示测试数据的组号,从1开始计数。
样例输入
(如果复制到控制台无换行,可以先粘贴到文本编辑器,再复制)
6 8 5 3 5 2 6 45 6 0 08 1 7 3 6 2 8 9 7 57 4 7 8 7 6 0 03 8 6 8 6 45 3 5 6 5 2 0 0-1 -1
样例输出
Case 1 is a tree.Case 2 is a tree.Case 3 is not a tree.
反正我就在想,不是一棵树的,要么有N多个根,要么没根,要么一个节点有N多个爸爸~
于是乎,第一份代码就出炉了...
#include<cstdio>#include<cstring>int apprd[10005],soned[10005],a,minx,maxx,roots,failed;int main(){ int i,j; while(1) { failed=0; minx=10005;maxx=0; memset(apprd,0,sizeof(apprd)); memset(soned,0,sizeof(soned)); while(1) { scanf("%d%d",&i,&j); if(i==-1) return 0; if(!i) break; if(minx>i) minx=i; if(minx>j) minx=j; if(maxx<i) maxx=i; if(maxx<j) maxx=j; apprd[i]=apprd[j]=1; soned[j]++; } roots=0; for(i=minx;i<=maxx;i++) { if(apprd[i]&&soned[i]==0) { roots++; if(roots>1) { failed=1; break; } } if(apprd[i]&&soned[i]>1) { failed=1; break; } } if(!roots) failed=1; if(failed) printf("Case %d is not a tree.\n",++a); else printf("Case %d is a tree.\n",++a); }}
可是......
WA的红色无情地刺痛了我的眼........
怎么会这样....
后来,发现,其实一组数据直接输入0 0的时候..它其实应该是一棵树....
没审题成千古恨啊!!!!!!!!!!!!!!
然后........再稍微处理了一下,成了:
#include<cstdio>#include<cstring>int apprd[10005],soned[10005],a,minx,maxx,roots,failed;int main(){ int i,j; while(1) { failed=0; minx=10005;maxx=-1; memset(apprd,0,sizeof(apprd)); memset(soned,0,sizeof(soned)); while(1) { scanf("%d%d",&i,&j); if(i==-1) return 0; if(!i) break; if(minx>i) minx=i; if(minx>j) minx=j; if(maxx<i) maxx=i; if(maxx<j) maxx=j; apprd[i]=apprd[j]=1; soned[j]++; } if(minx>maxx) { printf("Case %d is a tree.\n",++a); continue; } roots=0; for(i=minx;i<=maxx;i++) { if(apprd[i]&&soned[i]==0) { roots++; if(roots>1) { failed=1; break; } } if(apprd[i]&&soned[i]>1) { failed=1; break; } } if(!roots) failed=1; if(failed) printf("Case %d is not a tree.\n",++a); else printf("Case %d is a tree.\n",++a); }}
不仔细看你们可能看不出来吧.......
就是对一棵空树的特殊处理....
然后多组数据要把数组什么的该清零清零的就不说了吧
最近学校补课而且作业好多都没什么时间敲键盘了不开心
QAQ真的不想作孽
0 0
- (1374): 这是一棵树吗?
- ZSOI2012 这是一棵树吗? 姑且算图论?
- 1374 叠罗汉
- ZOJ-1374
- 并查集 4104 这是一棵树吗
- 【八中*二叉树】这是一棵树吗?
- ZOJ Problem 1374 Substrings
- CSU 1374: Restore Calculation
- 1374 - Power Calculus
- UVa 1374 Power Calculus
- uva 1374(暴力)
- UVA 1374 Power Calculus
- UVA - 1374 Power Calculus
- UVA - 1374 Power Calcul
- uva 1374 Power Calculus
- uva 1374 power calculus
- 【hihocoder】#1374 : 计算器
- ZCMU—1374
- C/C++中基本数据类型在不同系统中所占空间大小
- iOS Core Animation 性能调优 学习笔记
- 1047. 编程团体赛(20)
- 翻转单词顺序列
- pacman个人常用命令
- (1374): 这是一棵树吗?
- 2016展望未来,勿忘初心——工作录
- KiCad设计PCB-35-RTC电池座、单片机去耦电容、SD卡座、照相机接口的布线
- VS自带数据库SqlExpress
- 37-1-2-exercise
- Fast-rcnn 训练(2)- 跑demo
- 理解OAuth 2.0
- CSS控制Table内外边框、颜色、大小示例
- 用Tomcat服务器配置https双向认证过程实战