zoukankan      html  css  js  c++  java
  • 有标号的DAG计数 III

    Description

    给定一正整数n,对n个点有标号的有向无环图进行计数,这里加一个限制:此图必须是弱连通图。输出答案 mod 10007 的结果。

    Solution

    弱连通图即把边变成无向之后成为连通的图
    考虑补集转换,用 (DAG) 的方案数减去不连通的方案数
    (f[i]) 为大小为 (i)(DAG)的方案数
    可以像 (DAG I) 那样求出来

    (g[i]) 为弱连通图的方案数
    (g[n]=f[n]-sum_{i=1}^{n}g[i]*f[i-j]*C_{n-1}^{i-1})
    即枚举与 (1) 相连的连通块大小,因为这个块大小不一样,所以可以不重不漏

    #include<bits/stdc++.h>
    using namespace std;
    const int N=5005,mod=10007;
    int n,c[N][N],bin[N*N],f[N],g[N];
    int main(){
    	freopen("pp.in","r",stdin);
    	freopen("pp.out","w",stdout);
    	cin>>n;
    	for(int i=0;i<=n;i++){
    		c[i][0]=1;
    		for(int j=1;j<=i;j++)c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
    	}
    	bin[0]=1;for(int i=1,lim=n*n;i<=lim;i++)bin[i]=bin[i-1]*2%mod;
    	f[0]=g[0]=1;
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=i;j++)
    			f[i]=(f[i]+(j&1?1:-1)*1ll*f[i-j]*bin[j*(i-j)]*c[i][j])%mod;
    	}
    	for(int i=1;i<=n;i++){
    		g[i]=f[i];
    		for(int j=1;j<i;j++){
    			g[i]=(g[i]-1ll*f[i-j]*g[j]*c[i-1][j-1])%mod;
    		}
    	}
    	if(g[n]<0)g[n]+=mod;
    	cout<<g[n]<<endl;
    	return 0;
    }
    
    
  • 相关阅读:
    《架构真经》读后感2
    css的引入
    交流会发言
    css学习
    数据结构-哈希表、二叉排序数
    软工人学习日常
    Java包、类、方法、变量、常量命名规范
    数据库命名规范
    学生信息系统jsp界面
    学生信息系统servlet层
  • 原文地址:https://www.cnblogs.com/Yuzao/p/8551115.html
Copyright © 2011-2022 走看看