Problem Description
众人皆知,在编程领域中,C++是一门非常重要的语言,不仅仅因为其强大的功能,还因为它是很多其他面向对象语言的祖先和典范。不过这世上几乎没什么东 西是完美的,C++也不例外,多继承结构在带来强大功能的同时也给软件设计和维护带来了很多困难。为此,在java语言中,只允许单继承结构,并采用接口 来模拟多继承。KK最近获得了一份java编写的迷你游戏的源代码,他对这份代码非常感兴趣。这份java代码是由n个类组成的(本题不考虑接口),n个类分别用数字1..n表示。现在给你n个类之间的关系,有q次询问,每次询问某一个有多少个直接继承的子类。输入子类的个数和标号(标号按照字典序大小输出)。
Input
首先输入一个整数T,表示数据的组数。每组数据格式如下。
第一行包含两个整数n,m,表示该份代码中的n个类和m个单继承关系(1<=m
#include<stdio.h>
#include<malloc.h>
#include<string.h>
typedef struct node
{
int data;
struct node *l, *r;
}tree;
tree *tr[100010]; //多棵树
int f, a[100010]; //f用来方便控制输出空格,数组a储存树i的节点个数
tree *Creat(tree *t, int k); //把元素k,以创建二叉树的方式建立
void mid(tree *t); //中序输出树
int main()
{
int test;
scanf("%d", &test); //测试输入的组数
while(test--){
int i, n, m;
memset(a, 0, sizeof(a));
scanf("%d %d", &n, &m);
for(i = 0; i <= n; i++) //不能省!!!相当于初始化每棵树为空数
tr[i] = NULL;
int x, y;
for(i = 0; i < m; i++){
scanf("%d %d", &x, &y); //注意读题X、Y的含义,否则就容易把Y当做要插入的节点
a[y]++; //树Y的节点个数+1
tr[y] = Creat(tr[y], x); //建立二叉树
}
int num;
scanf("%d", &num); //num个询问
int k;
for(i = 0; i < num; i++){
scanf("%d", &k);
if(a[k] != 0){
printf("%d\n", a[k]);
f = 0;
mid(tr[k]);
printf("\n");
}
else printf("0\n");
}
}
return 0;
}
tree *Creat(tree *t, int k)
{
if(t == NULL){
tree *p = (tree *)malloc(sizeof(tree));
p->data = k;
p->l = p->r = NULL;
t = p;
}
else{
if(t->data > k)
t->l = Creat(t->l, k);
else if(t->data < k)
t->r = Creat(t->r, k);
}
return t;
}
void mid(tree *t)
{
if(t){
mid(t->l);
if(f == 0){ //如果是“第一个”节点则直接输出(无空格)
printf("%d", t->data);
f++;
}
else printf(" %d", t->data);
mid(t->r);
}
}