在树上做DFS,过程中保存最大的三个值,如果三个值不都被重新赋值就说明当前结点子树中结点数少于2(这个结点也算一个)。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAX_N = 10000 + 10;
struct Edge
{
int v, next;
};
Edge e[MAX_N];
int n, cnt, head[MAX_N], value[MAX_N], x, y, z;
void addEdge(int u, int v)
{
e[cnt].v = v;
e[cnt].next = head[u];
head[u] = cnt;
cnt++;
}
void dfs(int u)
{
for(int i = head[u]; i != -1; i = e[i].next)
{
int v = e[i].v;
if(value[v] >= x)
{
int temp1 = x;
x = value[v];
int temp2 = y;
y = temp1;
z = temp2;
}
else if(value[v] >= y)
{
int temp = y;
y = value[v];
z = temp;
}
else if(value[v] >= z)
z = value[v];
dfs(v);
}
}
int main()
{
//freopen("in.txt", "r", stdin);
while(scanf("%d", &n) != EOF)
{
cnt = 0;
memset(value, 0, sizeof(value));
memset(head, -1, sizeof(head));
int p, v;
scanf("%d", &v);
value[0] = v;
for(int i = 1; i < n; i++)
{
scanf("%d%d", &p, &v);
addEdge(p, i);
value[i] = v;
}
int q;
scanf("%d", &q);
for(int i = 0; i < q; i++)
{
x = y = z = -1;
scanf("%d", &p);
x = value[p];
dfs(p);
if(x != -1 && y != -1 && z != -1)
printf("%d %d %d\n", x, y, z);
else
printf("-1\n");
}
}
return 0;
}