Now we have a tree and some queries to deal with. Every node in the tree has a value on it. For one node A, we want to know the largest three values in all the nodes of the subtree whose root is node A. Node 0 is root of the tree, except it, all other nodes have a parent node.
Input
There are several test cases. Each test case begins with a line contains one integer n(1 ≤ n ≤ 10000), which indicates the number of the node in the tree. The second line contains one integer v[0], the value on the root. Then for the following n - 1 lines(from the 3rd line to the (n + 1)th line), let i + 2 be the line number, then line i + 2contains two integers parent and v[i], here parent is node i's parent node, v[i] is the value on node i. Here 0 ≤ v[i] ≤ 1000000. Then the next line contains an integer m(1 ≤m ≤ 10000), which indicates the number of queries. Following m lines, each line contains one integer q, 0 ≤ q < n, it meas a query on node q.
Output
For each test case, output m lines, each line contains one or three integers. If the query asked for a node that has less than three nodes in the subtree, output a "-1"; otherwise, output the largest three values in the subtree, from larger to smaller.
Sample Input
5 1 0 10 0 5 2 7 2 8 5 0 1 2 3 4
Sample Output
10 8 7 -1 8 7 5 -1 -1
思路:深度优先搜索,一层一层由子节点向跟节点回溯。
1.
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #define MAX 11111 6 using namespace std; 7 int Three_Max[MAX][15], val[MAX], cnt[MAX]; 8 typedef struct{ 9 int to, next; 10 }Node; 11 Node edge[MAX]; 12 int head[MAX]; 13 void AddEdge(int u, int v, int i){ 14 edge[i].to = v; 15 edge[i].next = head[u]; 16 head[u] = i; 17 } 18 bool cmp(int a, int b){ 19 return a > b; 20 } 21 void dfs(int id){ 22 cnt[id] = 1; 23 Three_Max[id][1] = val[id]; 24 for(int i = head[id];i != -1;i = edge[i].next){ 25 int u = edge[i].to; 26 dfs(u); 27 for(int j = 4;j <= 6;j ++) Three_Max[id][j] = Three_Max[u][j-3]; 28 sort(Three_Max[id] + 1, Three_Max[id]+10, cmp); 29 cnt[id] += cnt[u]; 30 } 31 } 32 int main(){ 33 int n, m, cc, u, v, k; 34 while(~scanf("%d", &n)){ 35 memset(head, -1, sizeof(head)); 36 memset(Three_Max, 0, sizeof(Three_Max)); 37 memset(cnt, 0, sizeof(cnt)); 38 k = 1; 39 for(int i = 0;i < n;i ++){ 40 if(0 == i){ 41 scanf("%d", &cc); 42 val[0] = cc; 43 }else{ 44 scanf("%d%d", &u, &cc); 45 val[i] = cc; 46 AddEdge(u, i, k); 47 k ++; 48 } 49 } 50 dfs(0); 51 scanf("%d", &m); 52 for(int i = 0;i < m;i ++){ 53 scanf("%d", &u); 54 if(cnt[u] < 3) printf("-1 "); 55 else{ 56 for(int j = 1;j < 3;j ++) printf("%d ", Three_Max[u][j]); 57 printf("%d ", Three_Max[u][3]); 58 } 59 } 60 } 61 return 0; 62 }
2.
1 #include<iostream> 2 #include<climits> 3 #include<algorithm> 4 #include<cstring> 5 #include<cstdio> 6 #define MAX 11111 7 using namespace std; 8 int Three_Max[MAX][15], val[MAX], cnt[MAX]; 9 typedef struct{ 10 int to, next; 11 }Node; 12 Node edge[MAX]; 13 int head[MAX]; 14 void AddEdge(int u, int v, int i){ 15 edge[i].to = v; 16 edge[i].next = head[u]; 17 head[u] = i; 18 } 19 bool cmp(int a, int b){ 20 return a > b; 21 } 22 int *dfs(int id){ 23 cnt[id] = 1; 24 Three_Max[id][1] = val[id]; 25 for(int i = head[id];i != -1;i = edge[i].next){ 26 int u = edge[i].to; 27 int *temp = dfs(u); 28 for(int j = 4;j <= 6;j ++) Three_Max[id][j] = temp[j-3]; 29 sort(Three_Max[id] + 1, Three_Max[id]+10, cmp); 30 cnt[id] += cnt[u]; 31 } 32 return Three_Max[id]; 33 } 34 int main(){ 35 int n, m, cc, u, v, k; 37 while(~scanf("%d", &n)){ 38 memset(head, -1, sizeof(head)); 39 memset(Three_Max, 0, sizeof(Three_Max)); 40 memset(cnt, 0, sizeof(cnt)); 41 k = 1; 42 for(int i = 0;i < n;i ++){ 43 if(0 == i){ 44 scanf("%d", &cc); 45 val[0] = cc; 46 }else{ 47 scanf("%d%d", &u, &cc); 48 val[i] = cc; 49 AddEdge(u, i, k); 50 k ++; 51 } 52 } 53 dfs(0); 54 scanf("%d", &m); 55 for(int i = 0;i < m;i ++){ 56 scanf("%d", &u); 57 if(cnt[u] < 3) printf("-1 "); 58 else{ 59 for(int j = 1;j < 3;j ++) printf("%d ", Three_Max[u][j]); 60 printf("%d ", Three_Max[u][3]); 61 } 62 } 63 } 64 return 0; 65 }