CF963B Destruction of a Tree(高级DFS)

题意:

您将得到一棵树(具有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);
}
原文地址:https://www.cnblogs.com/zhanglichen/p/13662055.html