zoukankan      html  css  js  c++  java
  • 【BZOJ2560】串珠子 状压DP+容斥

    【BZOJ2560】串珠子

    Description

      铭铭有n个十分漂亮的珠子和若干根颜色不同的绳子。现在铭铭想用绳子把所有的珠子连接成一个整体。
      现在已知所有珠子互不相同,用整数1到n编号。对于第i个珠子和第j个珠子,可以选择不用绳子连接,或者在ci,j根不同颜色的绳子中选择一根将它们连接。如果把珠子看作点,把绳子看作边,将所有珠子连成一个整体即为所有点构成一个连通图。特别地,珠子不能和自己连接。
      铭铭希望知道总共有多少种不同的方案将所有珠子连成一个整体。由于答案可能很大,因此只需输出答案对1000000007取模的结果。

    Input

     标准输入。输入第一行包含一个正整数n,表示珠子的个数。接下来n行,每行包含n个非负整数,用空格隔开。这n行中,第i行第j个数为ci,j。

    Output

     标准输出。输出一行一个整数,为连接方案数对1000000007取模的结果。

    Sample Input

    3
    0 2 3
    2 0 4
    3 4 0

    Sample Output

    50

    HINT

      对于100%的数据,n为正整数,所有的ci,j为非负整数且不超过1000000007。保证ci,j=cj,i。每组数据的n值如下表所示。
    编号 1 2 3 4 5 6 7 8 9 10    
    n      8 9 9 10 11 12 13 14 15 16  

    题解:还记得n个点有标号的无向连通图个数怎么求吗?如果记得的话,此题就简单了。

    用f[S]表示与1号点连通的点的状态为S的方案数。我们先与处理出g数组,$g[S]=prodlimits_{u,v in S} (c[u][v]+1)$,然后f[S]就等于g[S]减去S中某些点与1号点不连通的方案数。那么我们枚举此时与1号点连通的点的状态,其余的点与这个连通块均没有边相连,但是其余的点之间可以任意连边,所以有:

    $f[S]=sumlimits_{S' subsetneq S}f[S'] imes g[S - S' ]$

    所以时间复杂度就是枚举子集的$O(3^n)$。

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    using namespace std;
    typedef long long ll;
    const ll P=1000000007;
    int n,m;
    int c[20][20];
    int v[20],p[20],ref[1<<16],Log[1<<16];
    ll f[1<<16],g[1<<16];
    int main()
    {
    	scanf("%d",&n);
    	int i,j,u;
    	for(i=0;i<n;i++)	for(j=0;j<n;j++)	scanf("%d",&c[i][j]);
    	for(i=0;i<n;i++)	Log[1<<i]=i;
    	g[0]=1;
    	for(i=1;i<(1<<n);i++)
    	{
    		ll tmp=1;
    		for(u=Log[i&-i],j=i-(i&-i);j;j-=j&-j)	tmp=tmp*(c[u][Log[j&-j]]+1)%P;
    		g[i]=g[i-(i&-i)]*tmp%P;
    	}
    	for(i=1;i<(1<<n);i++)
    	{
    		m=0;
    		for(j=i-(i&-i);j;j-=j&-j)	p[m++]=j&-j;
    		for(j=1;j<(1<<m);j++)
    		{
    			ref[j]=ref[j-(j&-j)]|p[Log[j&-j]];
    			f[i]=(f[i]+f[i^ref[j]]*g[ref[j]])%P;
    		}
    		f[i]=(g[i]-f[i]+P)%P;
    	}
    	printf("%lld",f[(1<<n)-1]);
    	return 0;
    }
  • 相关阅读:
    IOS动态类型isKindOfClass, isMemberOfClass
    IOS-sqlite3数据库: create table数据库表及对数据库表的增删改查(create/insert/delete)
    TCP/UDP区别
    IOS中的NSData和NSFileManager例子微解
    IOS TableView的Delegate Methods-tableView didSelectRowAtIndexPath
    IOS IPA打包和真机测试
    使用autolayout的NSLayoutConstraint类中的constraintWithItem 、constraintsWithVisualFormat这两个类方法来创建视图并可以实现自动布局
    自定义圆形进度条
    通过cagradientLayer类封装uiimageview动画色度差
    通过CAGradientLayer类实现色度差动画
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/7859048.html
Copyright © 2011-2022 走看看