Codeforces 963B Destruction of a Tree 思维+dfs

题目大意:

给出一棵树,每次只能摧毁有偶数个度的节点,摧毁该节点后所有该节点连着的边都摧毁,判断一棵树能否被摧毁,若能,按顺序输出摧毁的点,如果有多种顺序,输出一种即可

基本思路:

1)我一开始自然而然想到的,当然是贪心,首先判断能否可行,然后我是想先从叶子到根摧毁一编,然后从根开始再摧毁,我觉得应该可行,还没试验;

2)rank前10的代码,我就不不自量力的去评价了,自己体会吧。

代码如下:

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>

using namespace std;

typedef long long ll;
typedef long long LL;
typedef pair<int,int> pii;
const int inf = 0x3f3f3f3f;
const int maxn = 200000+10;
const ll mod = 1e9+9;

vector<int>gra[maxn];
bool ispos[maxn];
bool dfs(int u,int pre){
    bool ans=1;
    int sz=gra[u].size();
    for(int i=0;i<sz;i++){
        int v=gra[u][i];
        if(v==pre) continue;
        ispos[v]=dfs(v,u);
        if(ispos[v]) ans^=1;
    }
    return ans;
}
void print(int u,int pre){
    int sz=gra[u].size();
    for(int i=0;i<sz;i++){
        int v=gra[u][i];
        if(v==pre) continue;
        if(!ispos[v]) print(v,u);
    }
    printf("%d\n",u);
    for(int i=0;i<sz;i++){
        int v=gra[u][i];
        if(v==pre) continue;
        if(ispos[v]) print(v,u); 
    }
}
int main(){
    int n,rt;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        int u;
        scanf("%d",&u);
        if(!u){
            rt=i;
        }else{
            gra[u].push_back(i);
            gra[i].push_back(u);
        }
    }
    bool flag=dfs(rt,0);
    if(flag){
        printf("YES\n");
        print(rt,0);
    }else{
        printf("NO\n");
    }
    return 0;
}

  

转载于:https://www.cnblogs.com/imzscilovecode/p/8881927.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值