C++,数据结构关于树的问题

小 Z 想要一一拜访羊村村委会的干部们,但是他不知道他的拜访名单合不合适。 (一个合适的拜访名单是在拜访某个人之前,必须先拜访他所有的直系上级领 导)。对于他的拜访名单,请你帮他核查一下是否合理。
★数据输入
输入第一行为一个 N(0 < N <= 1000)表示村委会干部的数量。
接下来 N-1 行,每行两个数字 Ci 和 Fi 表示 Ci 的直系上司是 Fi。(节点编号为 1 到 n,且每个人最多只有一个直接的上司)
接下来一行输出 N 个数字表示拜访名单中得拜访顺序。
★数据输出
如果拜访名单合适,就输出 Yes,否则输出 No。
输入示例 输出示例 6
1 2
3 2
4 1
5 1
6 3
2 1 4 5 3 6
输出示例
YES

#include<stdio.h>

#define MAX_NO 1000

typedef struct node{
int val; //access flag
unsigned ref; //parent reference
}*Node; //upside down tree node

struct node all[MAX_NO + 1];
unsigned input[MAX_NO + 1][2];
unsigned list[MAX_NO + 1];
int main()
{
int test, i;
scanf("%d", &test);
for(i = 1; i < test; i++)
scanf ("%d%d", input[i], input[i] + 1);
for(i = 1; i <= test; i++)
scanf("%d",list + i);
for(i = 1; i < test; i++)
all[input[i][0]].ref = input[i][1];
/* init */
all[list[1]].val = 1;
for(i = 2; i <= test; i++)
{
all[list[i]].val = 1; //set flag
if(all[all[list[i]].ref].val == 0)
{
printf("No");
return 0;
}
}
printf("Yes");
return 0;
}
温馨提示:答案为网友推荐,仅供参考