1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| #include<bits/stdc++.h> #define MAXN 3005 #define REG register using namespace std; inline void read(int& x){ static char c; while(!isdigit(c=getchar()));x=c^48; while(isdigit(c=getchar()))x=(x*10)+(c^48); }
int n;
struct Edge{int v,nxt;}ed[MAXN<<1]; int head[MAXN],cnt; inline void adde(int u,int v){ed[++cnt]=(Edge){v,head[u]},head[u]=cnt;} inline void add(int u,int v){adde(u,v),adde(v,u);} #define FORE(i,Now) for(REG int i=head[Now];i;i=ed[i].nxt)
int A[MAXN];
int Win[MAXN];
void dfs(int Now,int Fa){ int Min=1000000001; FORE(i,Now){ int v=ed[i].v; if(v==Fa) continue; dfs(v,Now); if(Win[v]) continue; Min=A[v]<Min?A[v]:Min; } if(Min>=A[Now]) Win[Now]=0; else Win[Now]=1; }
inline void Work(){ read(n); for(REG int i=1;i<=n;++i) read(A[i]); for(REG int i=1;i<n;++i){int u,v;read(u),read(v),add(u,v);} for(REG int i=1;i<=n;++i){ memset(Win,0,sizeof Win); dfs(i,i); if(Win[i]) printf("%d ",i); } }
int main(){Work();}
|