zoukankan      html  css  js  c++  java
  • D. Destruction of a Tree_dfs序_性质分析_思维题

    题意:
    给定一棵树,每次可以拆掉一个树上度数为偶数的点,拆掉该点后,与该点所连的所有边都会被删掉。问,是否有一种删点顺序可以删掉所有的点。如果有,则输出任意一组解。
    数据范围:线性做法 O(n)O(n)

    不妨从叶子节点开始考虑问题。不难证明,距叶子节点最近的一个偶点一定要在删除父节点之前被删掉,因为如果先删除父节点则原偶点及其子树中所有点的度数都会是基数。
    值得注意的是,每次选择的一定是深度最大的叶节点,所以我们要在 dfsdfs 序上进行操作
    我们可以在树的 dfsdfs 序上进行操作。然后对第一个偶点进行 dfsdfsdfsdfs 的过程中将所有偶点加入到答案队列中,并将第一个找到的偶点与父节点分离。这样,父节点有成为了全新的叶节点,并如此反复下去即可。
    时间复杂度为 O(n)O(n)

    Code:

    #include<cstdio>
    #include<stack>
    #include<queue>
    using namespace std;
    const int maxn = 500000 + 5;
    int head[maxn], to[maxn << 1], nex[maxn << 1], cnt, degree[maxn], parent[maxn], vis[maxn];
    stack<int>dfs; queue<int> answer;
    inline void add_edge(int u,int v) 
    { 
        nex[++cnt] = head[u];
        head[u] = cnt;
        to[cnt] = v; 
    }
    void dfs1(int u,int fa)
    { 
        dfs.push(u);  parent[u] = fa;  
        for(int v = head[u]; v ; v = nex[v])  if(to[v] != fa) dfs1(to[v], u); 
    }
    void dfs2(int u)
    {
        answer.push(u); vis[u] = 1;
        for(int v = head[u]; v ; v = nex[v]){
            --degree[to[v]];
            if(to[v] == parent[u] || vis[to[v]]) continue;
            if(degree[to[v]] % 2 == 0) dfs2(to[v]);
        }
    }
    int main()
    {
      
        int n; scanf("%d",&n);
        for(int i = 1;i <= n; ++i){ int a; scanf("%d",&a); if(a == 0) continue; add_edge(i,a); add_edge(a,i); ++degree[a], ++degree[i]; }
        dfs1(1, 0);
        while(dfs.size())
        {
            int u = dfs.top(); dfs.pop();
            if(degree[u] % 2 == 0) dfs2(u);
        }
        if(answer.size() == n)
        {
            printf("YES
    ");
            while(!answer.empty()){ printf("%d
    ",answer.front()); answer.pop();} 
        }
        else printf("NO");
        return 0;
    }
    
  • 相关阅读:
    pgspider sqlite mysql docker 镜像
    pgspider docker 镜像
    pgspider基于pg 的高性能数据可视化sql 集群引擎
    diesel rust orm 框架试用
    golang 条件编译
    Performance Profiling Zeebe
    bazel 学习一 简单java 项目运行
    一个好用node http keeplive agnet
    gox 简单灵活的golang 跨平台编译工具
    mailhog 作为smtp server mock工具
  • 原文地址:https://www.cnblogs.com/guangheli/p/9845111.html
Copyright © 2011-2022 走看看