题意:给你一棵树,只能将度为偶数的节点删除,并删除相连的边,求是否有一种方案将所有点删除。
题解:若(n-1)位偶数则肯定存在一种解法,然后我们贪心的从叶子节点开始往里删除,若当前节点能够被删除,再继续判断其子节点。
AC代码:
#include<stdio.h> #include<vector> #include<stack> using namespace std; vector<int>vt[200005]; vector<int>ans; stack<int>sta; int du[200005],fa[200005],mark[200005]; void dfs(int u,int f) { fa[u]=f; sta.push(u); for(int i=0;i<vt[u].size();i++) { int to=vt[u][i]; if(to==f)continue; dfs(to,u); } } void dfs(int u) { ans.push_back(u); mark[u]=1; for(int i=0;i<vt[u].size();i++) { int to=vt[u][i]; if(to==fa[u]||mark[to])continue; du[to]--; if(du[to]%2==0) dfs(to); } } int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { int k; scanf("%d",&k); if(k==0)continue; vt[k].push_back(i); vt[i].push_back(k); du[k]++;du[i]++; } dfs(1,1); while(!sta.empty()) { int k=sta.top(); sta.pop(); if(du[k]%2==0) { ans.push_back(k); mark[k]=1; for(int i=0;i<vt[k].size();i++) { int to=vt[k][i]; du[to]--; if(to==fa[k])continue; if(du[to]%2==0) dfs(to); } } } if(ans.size()!=n)printf("NO\n"); else { printf("YES\n"); for(int i=0;i<n;i++) printf("%d\n",ans[i]); } }