zoukankan      html  css  js  c++  java
  • 最小支配集(poj3659)

    最小覆盖集:点覆盖边
    最小支配集:点覆盖点

    由于这是一棵无根树,建树的不同会导致答案的不同,所以必须要考虑父亲结点的状态;如果是有根树,那么树的遍历过程是一定的,所以直接从子结点向上推就可以了,不需要再考虑父亲结点。

    AC代码

    #include<cstdio>
    #include<cstring>
    #include<cctype>
    #include<algorithm>
    using namespace std;
    typedef long long LL;
    const int N=1e5+5;
    const int inf=0x3f3f3f3f;
    const int mod=1e9+7;
    #define ls (i<<1)
    #define rs (i<<1|1)
    #define fi first
    #define se second
    #define mk make_pair
    #define mem(a,b) memset(a,b,sizeof(a))
    LL read()
    {
        LL x=0,t=1;
        char ch=getchar();
        while(!isdigit(ch)){ if(ch=='-')t=-1; ch=getchar(); }
        while(isdigit(ch)){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
        return x*t;
    }
    struct edge
    {
        int from,to,next;
        edge(){}
        edge(int ff,int tt,int nn)
        {
            from=ff; to=tt; next=nn;
        }
    };
    edge e[N<<1];
    int head[N],f[N][3],tot;
    void add(int from,int to)
    {
        e[++tot]=edge(from,to,head[from]);
        head[from]=tot;
    }
    void dfs(int u,int pre)
    {
        f[u][0]=1;///f[u][0]表示当前点覆盖且子树均被覆盖的最小支配集
        f[u][1]=0;///f[u][1]表示当前点不覆盖,被父亲覆盖且其子树均被覆盖的最小支配集
        f[u][2]=0;///f[u][2]表示当前点不覆盖,被儿子点覆盖且其子树军被覆盖的最小支配集
        int minn=inf,flag=1;
        for(int i=head[u];i;i=e[i].next)
        {
            int v=e[i].to;
            if(v==pre) continue;
            dfs(v,u);
            f[u][0]+=min(min(f[v][0],f[v][1]),f[v][2]);
            f[u][1]+=min(f[v][0],f[v][2]);
            if(f[v][0]<=f[v][2])
            {
                flag=0;
                f[u][2]+=f[v][0];
            }
            else
            {
                f[u][2]+=f[v][2];
                minn=min(f[v][0]-f[v][2],minn);
            }
        }
        if(flag) f[u][2]+=minn;
    }	
    int main()
    {
        int n=read();
        for(int i=1;i<n;i++)
        {
            int x=read(),y=read();
            add(x,y); add(y,x);
        }
        dfs(1,0);
        printf("%d
    ",min(f[1][0],f[1][2] ) );
        return 0;
    }
  • 相关阅读:
    llvm,gcc
    smp,numa,mpp,umam,olap,dss,oltp,greenplum,presto
    数据结构学习时的零散算法
    Hadoop 伪分布式上安装 HBase
    可以ping通虚拟机但不能telnet 9000端口
    北邮连接bupt-mobile
    北邮软院机试2018
    研究生面试自我介绍
    Java面试题
    操作系统面试题
  • 原文地址:https://www.cnblogs.com/DeepJay/p/12025193.html
Copyright © 2011-2022 走看看