[atARC105F]Lights Out on Connected Graph
记$G[S]$表示图$G$在点集$S$上的导出子图,即$G[S]=(S,{(x,y)|x,y\in S且(x,y)\in E})$
定义$g(S)$为所有$E'$(满足$E'\subseteq G[S].E$)的图$G'=(S,E')$的染色方式之和,考虑枚举其中一种颜色的点集,则有$g(S)=\sum_{T\subseteq S}2^{|\{(x,y)|(x,y)\in E且x\in T且y\in C_{S}T\}|}$(这些边可以选或不选)
考虑计算$|\{(x,y)|(x,y)\in G[S].E且x\in T且y\in C_{S}T\}|$,可以看作$S$中边数-$T$中边数-$C_{S}T$中边数,$o(2^{n}m)$预处理出$|G[S].E|$,那么即$|G[S].E|-|G[T].E|-|G[C_{S}T].E|$
定义$f(S)$为有多少$E'$使得$E'\subseteq G[S].E$且$G'=(S,E')$为好图,那么$f(V)$即为答案
$f(S)$的计算略微比较复杂,定义$g'(S)$为所有不连通的$G'=(S,E')$(参考$g(S)$定义)的染色方式之和,容易发现有$f(S)=\frac{g(S)-g'(S)}{2}$(联通二分图有2种染色方式)
对于$g'(S)$,枚举$S$的某个$k$所属连通块,那么即有$g'(S)=\sum_{k\in T,T\subset S}f(T)g(C_{S}T)$($k$为$S$中任意一个元素,注意这里$T\ne S$)
上面的转移涉及到一个枚举子集的技巧,因此时间复杂度$o(3^{n}+2^{n}m)$

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 200005
4 #define M 1005
5 #define mod 998244353
6 int n,m,x,y,mi[M],e[M],se[N],g[N],f[N];
7 int main(){
8 scanf("%d%d",&n,&m);
9 mi[0]=1;
10 for(int i=1;i<=m;i++){
11 scanf("%d%d",&x,&y);
12 e[i]=((1<<x-1)|(1<<y-1));
13 mi[i]=mi[i-1]*2%mod;
14 }
15 for(int i=0;i<(1<<n);i++)
16 for(int j=1;j<=m;j++)se[i]+=((i&e[j])==e[j]);
17 for(int i=0;i<(1<<n);i++){
18 g[i]=1;
19 for(int j=i;j;j=((j-1)&i))g[i]=(g[i]+mi[se[i]-se[j]-se[i^j]])%mod;
20 }
21 for(int i=0;i<(1<<n);i++){
22 f[i]=g[i];
23 int k=i-(i&(i-1));
24 for(int j=i-k;j;j=((j-1)&i))
25 if (j&k)f[i]=(f[i]+mod-1LL*f[j]*g[i^j]%mod)%mod;
26 }
27 printf("%lld",f[(1<<n)-1]*(mod+1LL)/2%mod);
28 }
[atARC105F]Lights Out on Connected Graph的更多相关文章
- poj 1737 Connected Graph
// poj 1737 Connected Graph // // 题目大意: // // 带标号的连通分量计数 // // 解题思路: // // 设f(n)为连通图的数量,g(n)为非连通图的数量 ...
- POJ1737 Connected Graph
Connected Graph Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3156 Accepted: 1533 D ...
- POJ 1737 Connected Graph 题解(未完成)
Connected Graph Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3156 Accepted: 1533 D ...
- Connected Graph
Connected Graph 求n个点的无向联通图数量,\(n\leq 50\). 解 直接无向联通图做状态等于是以边点做考虑,难以去重,考虑联通对立面即不联通. 不难求出n个点的总方案数为\(2^ ...
- 【poj1737】 Connected Graph
http://poj.org/problem?id=1737 (题目链接) 题意 求n个节点的无向连通图的方案数,不取模w(゚Д゚)w Solution 刚开始想了个第二类斯特林数,然而并不知道怎么求 ...
- 【Java】【高精度】【组合数】【递推】poj1737 Connected Graph
http://blog.csdn.net/sdj222555/article/details/12453629 这个递推可以说是非常巧妙了. import java.util.*; import ja ...
- [poj1737]Connected Graph(连通图计数)
题意:输出题中带有$n$个标号的图中连通图的个数. 解题关键: 令$f(n)$为连通图的个数,$g(n)$为非联通图的个数,$h(n)$为总的个数. 则$f(n) + g(n) = h(n)$ 考虑标 ...
- POJ 1737 Connected Graph(高精度+DP递推)
题面 \(solution:\) 首先做个推销:带负数的压位高精度(加减乘+读写) 然后:由 \(N\) 个节点组成的无向图的总数为: \(2^{N*(N-1)/2}\) (也就是说这个图总共有 \( ...
- POJ 1737 Connected Graph (大数+递推)
题目链接: http://poj.org/problem?id=1737 题意: 求 \(n\) 个点的无向简单(无重边无自环)连通图的个数.\((n<=50)\) 题解: 这题你甚至能OEIS ...
随机推荐
- 试题 算法训练 最大最小公倍数 java题解
资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少. 输入格式 输入一个正整数N. 输出格式 输出一个整数 ...
- 【死磕 NIO】— Reactor 模式就一定意味着高性能吗?
大家好,我是大明哥,我又来了. 为什么是 Reactor 一般所有的网络服务,一般分为如下几个步骤: 读请求(read request) 读解析(read decode) 处理程序(process s ...
- 【数据结构与算法Python版学习笔记】递归(Recursion)——定义及应用:分形树、谢尔宾斯基三角、汉诺塔、迷宫
定义 递归是一种解决问题的方法,它把一个问题分解为越来越小的子问题,直到问题的规模小到可以被很简单直接解决. 通常为了达到分解问题的效果,递归过程中要引入一个调用自身的函数. 举例 数列求和 def ...
- 面试题 08.12. N皇后
题目 设计一种算法,打印 N 皇后在 N × N 棋盘上的各种摆法,其中每个皇后都不同行.不同列,也不在对角线上.这里的"对角线"指的是所有的对角线,不只是平分整个棋盘的那两条对角 ...
- Gitlab Burndown Chart
一.说明 通过调用gitlab api直接获取相应project的所有issues,然后对其进行统计以制作燃尽图 二.方法 1.生成 Personal access token Gitlab > ...
- 【二食堂】Beta - Scrum Meeting 12
Scrum Meeting 12 例会时间:5.27 20:00~20:10 进度情况 组员 当前进度 今日任务 李健 1. 知识图谱导出功能完成 issue 1. 继续完成文本保存的工作 issue ...
- 在浏览器上开发GO和Vue!(基于code-server)
在浏览器上开发GO和Vue!(基于code-server) 曾几何时,开发者们都被安装编程环境苦恼,尽管现在很多语言的开发环境已经不难装了,但是如果我们能有一个运行在云端的编译器,那么我们就可以随时随 ...
- 网络摄像机中的IR-CUT详解
自然界存在着各种波长的光线,通过折射人眼能看到不同颜色的光线,这就是光线的波长不同所导致的.其实还有许多光线是人眼看不到的,人眼识别光线的波长范围在320nm-760nm之间,超过760nm的光线人眼 ...
- Python课程笔记(二)
1.格式化输出 print("%d %d %s" % (15, 3.14, 12.8)) 对比C语言 printf("%d,%d,%s",15, 3.14, 1 ...
- Python课程笔记(六)
今天上课补上了上次未学完比较重点的鼠标和键盘事件,同时开始学习运用turtle进行绘图. 本次课程的代码: https://gitee.com/wang_ming_er/python_course_l ...