思路:
如果是两个点,那么肯定不能往大的那个走,因为对手只要推回来就输了
所以就是一道树上只能往小走的DFS
c o d e code code
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
const int MAXN = 3005;
int n;
int a[MAXN];
vector<int> b[MAXN];
bool dfs(int x, int len) {
bool flag = 0;
if(len % 2 == 1) {
for(int i = 0; i < b[x].size(); i ++) {
int y = b[x][i];
if(a[y] >= a[x]) continue;
flag |= dfs(y, len + 1);
}
return flag;
}
else {
flag = 1;
for(int i = 0; i < b[x].size(); i ++) {
int y = b[x][i];
if(a[y] >= a[x]) continue;
flag &= dfs(y, len + 1);
}
return flag;
}
}
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i ++) scanf("%d", &a[i]);
for(int i = 1; i < n; i ++) {
int x, y;
scanf("%d%d", &x, &y);
b[x].push_back(y);
b[y].push_back(x);
}
bool bz = 0;
for(int i = 1; i <= n; i ++)
if(dfs(i, 1)) printf("%d ", i), bz = 1;
if(!bz) printf("-1");
return 0;
}