题意:
您将得到一棵树(具有n个顶点和n-1个边的图形,在其中可以仅使用其边缘从任何其他顶点到达任何顶点)。
如果顶点具有偶数阶数,则该顶点可以被破坏。 如果销毁一个顶点,则与其相连的所有边也会被删除。
销毁给定树中的所有顶点或确定不可能。
题解:
DFS的时候加一个变量f,当遇到一个节点可以删除时,删除这个节点,将f置为1往下搜索。
大神的思路太强了,感觉这个DFS方法让我自己想根本想不到。
/* *author: zlc *zucc_acm_lab *just do it */ #include<bits/stdc++.h> using namespace std; typedef long long ll; const double pi=acos(-1.0); const double eps=1e-6; const int mod=1e9+7; const int inf=1e9; const int maxn=2e5+100; inline int read () {int x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}return x*f;} ll qpow (ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;} int n; vector<int> g[maxn]; int inDegree[maxn]; int vis[maxn]; queue<int> q; vector<int> ans; void dfs (int u,int pre,int f) { if (!f) { for (int v:g[u]) { if (v==pre) continue; if (vis[v]) continue; dfs(v,u,0); } } if (inDegree[u]%2==0) { inDegree[u]=0; ans.push_back(u); vis[u]=1; for (int v:g[u]) { if (!vis[v]) { --inDegree[v]; if (v!=pre) dfs(v,u,true); } } } } int main () { n=read(); for (int i=1;i<=n;i++) { int x=read(); if (!x) continue; g[x].push_back(i); g[i].push_back(x); inDegree[i]++; inDegree[x]++; } dfs(1,1,0); if (ans.size()<n) return printf("NO "),0; printf("YES "); for (int v:ans) printf("%d ",v); }