zoukankan      html  css  js  c++  java
  • 2020牛客暑期多校训练营(第二场) [Cover the Tree]

    Cover the Tree

    题目大意:

    给一棵树,求最少的链使得所有的边至少被一条链覆盖,输出任意一种方案。

    题解:

    这个题目就是对于节点 (i) ,要不就是从下面找一个叶子节点,要不就是2个叶子节点,反正至少要一个节点,如此才能把 (i) 节点到 (i) 节点的父亲这条边覆盖。按照这个想法去写这个题目即可。

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <queue>
    #include <vector>
    #include <algorithm>
    #include <iostream>
    #define inf 0x3f3f3f3f
    #define inf64 0x3f3f3f3f3f3f3f3f
    using namespace std;
    const int maxn = 2e5+2;
    typedef long long ll;
    vector<int>G[maxn];
    int num[maxn],l[maxn],r[maxn];
    void add(int u,int v){
        G[u].push_back(v);
        G[v].push_back(u);
    }
    int ans[maxn];
    void dfs(int u,int pre){
        int res=0;
        for(int i=0;i<G[u].size();i++){
            int v=G[u][i];
            if(v==pre) continue;
            dfs(v,u);
            res++;
        }
        if(!res) {
            num[u]=1,l[u]=u;
            return ;
        }
        num[u]=0;
        l[u]=r[u]=0;
        for(int i=0;i<G[u].size();i++){
            int v = G[u][i];
            if(v==pre) continue;
            if(num[v]==1) {
                if(num[u]==0) num[u]=1,l[u]=l[v];
                else if(num[u]==1) num[u]=2,r[u]=l[v];
                else num[u]=1,ans[r[u]]=l[v];
            }
            else {
                if(num[u]==0) num[u]=2,l[u]=l[v],r[u]=r[v];
                else if(num[u]==1) num[u]=1,ans[l[u]]=r[v],l[u]=l[v];
                else num[u]=2,ans[l[u]]=r[v],l[u]=l[v];
            }
        }
        if(u==1){
            if(res==1) ans[l[u]]=1,ans[r[u]]=1;
            else ans[l[u]]=r[u];
        }
    }
    
    int main(){
        int n;
        scanf("%d",&n);
        for(int i=1;i<n;i++){
            int u,v;
            scanf("%d%d",&u,&v);
            add(u,v);
        }
        dfs(1,0);
        int now=0;
        for(int i=1;i<=n;i++){
            if(ans[i]) now++;
        }
        printf("%d
    ",now);
        for(int i=1;i<=n;i++){
            if(ans[i]) printf("%d %d
    ",i,ans[i]);
        }
        return 0;
    }
    
  • 相关阅读:
    C#开源实现MJPEG流传输
    EntityFramework中使用Repository装饰器
    Lambda应用设计模式
    Lambda表达式的前世今生
    那些年黑了你的微软BUG
    敏捷软件开发揭秘
    SVN previous operation has not finished
    NodeJS+Express开发web,为什么中文显示为乱码
    使用Visual Studio 调试断点不起作用的问题解决办法 调试Revit CAD 不能进入断点
    openFileDialog的Filter属性设置
  • 原文地址:https://www.cnblogs.com/EchoZQN/p/13295306.html
Copyright © 2011-2022 走看看