【bzoj2560】串珠子 状压dp+容斥原理
题目描述
有 $n$ 个点,点 $i$ 和点 $j$ 之间可以连 $0\sim c_{i,j}$ 条无向边。求连成一张无向连通图的方案数模 $10^9+7$ 。
两个方案不同,当且仅当:存在点对 $(i,j$ ,使得 $i$ 与 $j$ 之间的边数不同。
输入
标准输入。输入第一行包含一个正整数n,表示珠子的个数。接下来n行,每行包含n个非负整数,用空格隔开。这n行中,第i行第j个数为ci,j。
输出
标准输出。输出一行一个整数,为连接方案数对1000000007取模的结果。
样例输入
3
0 2 3
2 0 4
3 4 0
样例输出
50
题解
状压dp+容斥原理
和 【bzoj3456】城市规划 的前半部分方法类似,用总连边方案数减去不连通方案数得到连通方案数。
但是在本题中点与点是不同的,因此采用状压dp的方法来解决。
设 $f_i$ 表示 $i$ 集合的点连成无向连通图的方案数,$g_i$ 表示 $i$ 集合的点连成无向图的方案数。
预处理出 $g_i$ ,根据定义得 $g_i=\prod\limits_{j.k\in i,j<k}(c_{j,k}+1)$ 。
然后求 $f_i$ 。用总方案数 $g_i$ 减去不连通的方案数。枚举 $i$ 集合中编号最小的点($i\&(-i)$)所在连通块的集合 $j$ ,减去 $f_jg_{i-j}$ 。
故状态转移方程为: $f_i=g_i-\sum\limits_{j\subsetneqq i,(i\&(-i))\in j}f_jg_{i-j}$ 。
最后的答案就是 $f_{2^n-1}$ 。
时间复杂度 $O(2^n·n^2+3^n)$
#include <cstdio>
#define mod 1000000007
typedef long long ll;
ll c[20][20] , f[65540] , g[65540];
int main()
{
int n , i , j , k;
scanf("%d" , &n);
for(i = 0 ; i < n ; i ++ )
for(j = 0 ; j < n ; j ++ )
scanf("%lld" , &c[i][j]);
for(i = 0 ; i < (1 << n) ; i ++ )
{
g[i] = 1;
for(j = 0 ; j < n ; j ++ )
for(k = 0 ; k < j ; k ++ )
if(i & (1 << j) && i & (1 << k))
g[i] = g[i] * (c[j][k] + 1) % mod;
f[i] = g[i];
for(j = i & (i - 1) ; j ; j = i & (j - 1))
if(j & (i & -i))
f[i] = (f[i] - f[j] * g[i ^ j] % mod + mod) % mod;
}
printf("%lld\n" , f[(1 << n) - 1]);
return 0;
}
【bzoj2560】串珠子 状压dp+容斥原理的更多相关文章
- bzoj2560串珠子 状压dp+容斥(?)
2560: 串珠子 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 515 Solved: 348[Submit][Status][Discuss] ...
- bzoj2560 串珠子 状压DP
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2560 题解 大概是这类关于无向图的联通性计数的套路了. 一开始我想的是这样的,考虑容斥,那么就 ...
- BZOJ 2560: 串珠子 (状压DP+枚举子集补集+容斥)
(Noip提高组及以下),有意者请联系Lydsy2012@163.com,仅限教师及家长用户. 2560: 串珠子 Time Limit: 10 Sec Memory Limit: 128 MB Su ...
- 【BZOJ2560】串珠子 状压DP+容斥
[BZOJ2560]串珠子 Description 铭铭有n个十分漂亮的珠子和若干根颜色不同的绳子.现在铭铭想用绳子把所有的珠子连接成一个整体. 现在已知所有珠子互不相同,用整数1到n编号.对于第i个 ...
- 【uoj#37/bzoj3812】[清华集训2014]主旋律 状压dp+容斥原理
题目描述 求一张有向图的强连通生成子图的数目对 $10^9+7$ 取模的结果. 题解 状压dp+容斥原理 设 $f[i]$ 表示点集 $i$ 强连通生成子图的数目,容易想到使用总方案数 $2^{sum ...
- BZOJ1195 [HNOI2006]最短母串 【状压dp】
题目 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. 输入格式 第一行是一个正整数n(n<=12),表示给定的字符串的 ...
- BZOJ2669 [cqoi2012]局部极小值 状压DP 容斥原理
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2669 题意概括 有一个n行m列的整数矩阵,其中1到nm之间的每个整数恰好出现一次.如果一个格子比所 ...
- 4455: [Zjoi2016]小星星|状压DP|容斥原理
OrzSDOIR1ak的晨神 能够考虑状压DP枚举子集,求出仅仅保证连通性不保证一一相应的状态下的方案数,然后容斥一下就是终于的答案 #include<algorithm> #includ ...
- 【UVA1633】禁止的回文串(状压DP)
题意: 输入正整数n和k(1<=n<=400,1<=k<=10),求长度为n的01串中有多少个不含长度至少为k的回文连续子串.例如,n=k=3时只有4个串满足条件:001,01 ...
随机推荐
- Caliburn.Micro - Getting Started - Introduction
Caliburn.Micro Xaml made easy Introduction When my “Build Your Own MVVM Framework” talk was chosen f ...
- [agc010D]Decrementing-[。。。思考题]
Description 传送门 Solution 真是够神秘的啊... Alice和Bob两个真的城会玩. 不过本题一个暗示挺明显的.就是黑板上所有数不论何时gcd为1. 考场上我以为会很复杂,结果. ...
- tkinter事件高级用法实例
from tkinter import * import threading, time trace = 0 class CanvasEventsDemo: def __init__(self, pa ...
- spring源码-aop源码-5.1
一.aop的源码部分还是有点复杂的,但是为了更好的理解,我这里会省去很多不必要的逻辑实现过程.主要方向还是更好的理解整体代码的实现过程. 二.说明重点:aop的过程主要过程有两点:第一点,发现正确和适 ...
- 用python SMTP进行邮件发送
import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart & ...
- jenkens其实是代码上传工具
Jenkins 持续集成使用教程 用 jenkins 有什么好处 通过规范化来完成,简单,繁琐,浪费时间的重复工作 规范化工作,以免出现低级错误 实现随时随地任何人一键构建 ...... 安装 jen ...
- Zookeeper-----Zookeeper概述
一:Zookeeper的概念? ZooKeeper是一种分布式协调服务,用于管理大型主机.在分布式环境中协调和管理服务是一个复杂的过程.ZooKeeper通过其简单的架构和API解决了这个问题.Zoo ...
- 洛谷【P1854】花店橱窗布置
https://www.luogu.org/problemnew/show/P1854 题目描述 某花店现有编号由 1 到 F 的 F 束花, 每一束花的品种都不一样. 编号由 1 到 V 的 V 个 ...
- NodeJS实现同步的方法
NodeJS被打上了单线程.非阻塞.事件驱动…..等标签. 在单线程的情况下,是无法开启子线程的.经过了很久的研究,发现并没有thread函数!!!但是有时候,我们确实需要“多线程”处理事务.node ...
- Visiting a Friend(思维)
Description Pig is visiting a friend. Pig's house is located at point 0, and his friend's house is l ...