• bzoj4455【ZJOI2016】小星星


    题意:http://www.lydsy.com/JudgeOnline/problem.php?id=4455

       给一张图和该图的一棵生成树,求可能的编号方案数

    sol  :dalao教导我们,看到计数想容斥

       考虑对点i标号,O(2^n)枚举可以标的顶点,然后进行树形dp

       f[i][j]表示点i标j号的方案数,容斥一发即可

       最后答案为∑f[1][i],记得开longlong

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cmath>
    using namespace std;
    const int Mx=410;
    int n,m,cnt,a[Mx],map[Mx][Mx];
    long long ans,f[Mx][Mx];
    int tot,head[Mx],nxt[Mx],ver[Mx];
    void add(int x,int y)
    {
        nxt[++tot]=head[x];
        ver[tot]=y;
        head[x]=tot;
    }
    void dp(int x,int fa)
    {
        for(int i=head[x];i;i=nxt[i])
        {  
            int y=ver[i];  
            if(y!=fa) dp(y,x);
        }  
        for(int i=1;i<=cnt;i++)
        {  
            f[x][i]=1;  
            for(int j=head[x];j;j=nxt[j])
            {
                int y=ver[j]; long long t=0;
                if(y!=fa)
                {
                    for(int k=1;k<=cnt;k++)
                        if(map[a[i]][a[k]])
                            t+=f[y][k];
                    f[x][i]*=t;
                }  
            }  
        }  
    }  
    int main()
    {
        scanf("%d%d",&n,&m);  
        for(int i=1,x,y;i<=m;i++)
            scanf("%d%d",&x,&y),
            map[x][y]=map[y][x]=1;
        for(int i=1,x,y;i<n;i++)
            scanf("%d%d",&x,&y), 
            add(x,y),add(y,x);  
        for(int i=1;i<(1<<n);i++)
        {  
            cnt=0;long long t=0;  
            for(int j=1;j<=n;j++) 
                if((i>>(j-1))&1) a[++cnt]=j;
            dp(1,0);
            for(int j=1;j<=cnt;j++) t+=f[1][j];  
            ans+=t*(long long) (pow(-1,n-cnt));  
        }  
        printf("%lld
    ",ans);
        return 0;  
    }
  • 相关阅读:
    C#中使用MATLAB
    各种插值法及效果图对比
    Visual Studio中你所不知道的智能感知
    C#中使用Surfer
    XCode中连接使用GitHub
    个人作业Week1
    个人作业Week3
    个人作业Week2
    第一次作业——subway
    执行ajax加载页面中的js总结
  • 原文地址:https://www.cnblogs.com/xiaoxubi/p/6475524.html
Copyright © 2020-2023  润新知