题目:
Is It A Tree?
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 31536 | Accepted: 10716 |
Description
A tree is a well-known data structure that is either empty (null, void, nothing) or is a set of one or more nodes connected by directed edges between nodes satisfying the following properties.
There is exactly one node, called the root, to which no directed edges point.
Every node except the root has exactly one edge pointing to it.
There is a unique sequence of directed edges from the root to each node.
For example, consider the illustrations below, in which nodes are represented by circles and edges are represented by lines with arrowheads. The first two of these are trees, but the last is not.
In this problem you will be given several descriptions of collections of nodes connected by directed edges. For each of these you are to determine if the collection satisfies the definition of a tree or not.
There is exactly one node, called the root, to which no directed edges point.
Every node except the root has exactly one edge pointing to it.
There is a unique sequence of directed edges from the root to each node.
For example, consider the illustrations below, in which nodes are represented by circles and edges are represented by lines with arrowheads. The first two of these are trees, but the last is not.
![](https://i-blog.csdnimg.cn/blog_migrate/e396b4b2ddd3a623af2a8c4f9d4a84ec.jpeg)
In this problem you will be given several descriptions of collections of nodes connected by directed edges. For each of these you are to determine if the collection satisfies the definition of a tree or not.
Input
The input will consist of a sequence of descriptions (test cases) followed by a pair of negative integers. Each test case will consist of a sequence of edge descriptions followed by a pair of zeroes Each edge description will consist of a pair of integers; the first integer identifies the node from which the edge begins, and the second integer identifies the node to which the edge is directed. Node numbers will always be greater than zero.
Output
For each test case display the line "Case k is a tree." or the line "Case k is not a tree.", where k corresponds to the test case number (they are sequentially numbered starting with 1).
Sample Input
6 8 5 3 5 2 6 4 5 6 0 0 8 1 7 3 6 2 8 9 7 5 7 4 7 8 7 6 0 0 3 8 6 8 6 4 5 3 5 6 5 2 0 0 -1 -1
Sample Output
Case 1 is a tree. Case 2 is a tree. Case 3 is not a tree.
分析:
由题意,一棵树的充要条件为:
要么为空树,要么满足:
1.只有一个根节点(入度为零),其他节点入度为一;
2.根节点到其他节点有一条唯一的有向路径。
其实只要满足了第一条第二条自动满足。如果图不连通,不会只有一个根节点;如果路径不唯一,必有一个节点入度不为一。
故思路为:
若为空树直接判为树;
否则,统计每个节点入度,如果除了一个入度为零的结点其他节点入度均为一则是一棵树,若入度为零的结点不唯一或有的结点入度大于一,非树。
代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int in[1005];
bool used[1005];
int main(){
int t=1,a,b,x,y;
while(~scanf("%d%d",&a,&b)){
if(a<0&&b<0) break;
if(a==0&&b==0){
printf("Case %d is a tree.\n",t++);
continue;
}
memset(used,0,sizeof(used));
memset(in,0,sizeof(in));
in[b]++;
used[a]=true; used[b]=true;
while(~scanf("%d%d",&x,&y),(x&&y)){
used[x]=true; used[y]=true;
in[y]++;
}
int rt=0,flag=0;
for(int i=1;i<1005;++i){
if(used[i]){
if(in[i]>1){
printf("Case %d is not a tree.\n",t++);
flag=1;
break;
}
else if(in[i]==0) ++rt;
}
}
if(!flag){
if(rt!=1) printf("Case %d is not a tree.\n",t++);
else printf("Case %d is a tree.\n",t++);
}
}
return 0;
}
一个知识点不熟ce了一发。。。如果头文件都是<...h> 不可以加using namespace std;此时std会ce...
一般这样就好了...
#include<iostream>
using namespace std;
为了避免引入命名空间之后因重名带来的ce,可以使用如下姿势
#include<iostream>
using std::cin;
using std::cout;
using std::endl;