【pkuwc2018】随机算法
我们考虑用状压dp来解决这一道题
设$f[i][S]$表示当前排列的前i位所构成的最大独立集恰好为S的方案数
我们考虑用$f[i][S]$推出$f[i+1][S']$的值
那么我们有两种扩展的方法,一种是在第$i+1$位,加入一个数$j$,满足$S∩j=∅$,且$S∪j$为最大独立集。
这种情况,相当于在原本的最大独立集中,新加入了一个点j,那么显然可以对答案产生贡献
则有$f[i+1][S|(1<<j)]+=f[i][S]$
另一种是:我们在第i+1位,填入一个不会对最大独立集产生变化的数。
根据题意,我们要填入一个数j,满足集合S中,存在于节点$j$相邻的点。
则有$f[i+1][S]+=f[i][S]*(p[S]-i) $,其中$p[S]$表示与集合$S$相连的点的个数+集合$S$所包含的点数
设题目中所给的图的最大独立集大小为$k$
最后的答案显然为$\dfrac{\sum\limits_{|S|=k}f[n][k]}{n!}$
#include<bits/stdc++.h>
#define M 20
#define lowbit(x) ((x)&(-(x)))
#define MOD 998244353
#define L long long
using namespace std; L pow_mod(L x,L k){L ans=1; for(;k;k>>=1,x=x*x%MOD) if(k&1) ans=ans*x%MOD; return ans;} int a[M],ok[1<<M],p[1<<M],siz[1<<M];
L f[M+1][1<<M];
int n,m,U; int main(){
scanf("%d%d",&n,&m);
U=1<<n;
for(int i=1;i<U;i++) siz[i]=siz[i-lowbit(i)]+1;
for(int i=0;i<n;i++) a[i]^=(1<<i);
for(int i=1;i<=m;i++){
int x,y; scanf("%d%d",&x,&y);
x--; y--;
a[x]^=(1<<y); a[y]^=(1<<x);
}
ok[0]=1;
for(int i=0;i<U;i++)
if(ok[i]){
for(int j=0;j<n;j++)
if((i&a[j])==0)
ok[i|(1<<j)]=1;
}
int maxn=0;//最大独立集大小
for(int i=1;i<U;i++) if(ok[i]) maxn=max(maxn,siz[i]); for(int i=1;i<U;i++)
for(int j=0;j<n;j++)
if(i&a[j]) p[i]++;
//p[S] 与点集S相连的点数为多少(包括S中的点) f[0][0]=1;
for(int i=0;i<n;i++)
for(int S=0;S<U;S++)
if(f[i][S]){
f[i+1][S]=(f[i+1][S]+f[i][S]*(p[S]-i))%MOD; for(int j=0;j<n;j++)
if((S&(1<<j))==0&&ok[S|(1<<j)]){
f[i+1][S+(1<<j)]=(f[i+1][S+(1<<j)]+f[i][S])%MOD;
}
} L ans=0;
for(int S=1;S<U;S++)
if(siz[S]==maxn&&ok[S]==1)
ans=(ans+f[n][S])%MOD; L fac=1;
for(int i=1;i<=n;i++) fac=fac*i%MOD;
printf("%lld\n",ans*pow_mod(fac,MOD-2)%MOD);
}
【pkuwc2018】随机算法的更多相关文章
- [PKUWC2018]随机算法
题意:https://loj.ac/problem/2540 给定一个图(n<=20),定义一个求最大独立集的随机化算法 产生一个排列,依次加入,能加入就加入 求得到最大独立集的概率 loj25 ...
- 【洛谷5492】[PKUWC2018] 随机算法(状压DP)
点此看题面 大致题意: 用随机算法求一张图的最大独立集:每次随机一个排列,从前到后枚举排列中的点,如果当前点加入点集中依然是独立集,就将当前点加入点集中,最终得到的点集就是最大独立集.求这个随机算法的 ...
- LG5492 [PKUWC2018]随机算法
题意 有一种贪心求最大独立集的算法: 随机一个排列 按顺序加入独立集,如果一个点能加入,就加入\({S}\) 给出一张图,问得出正确答案的概率. \(n \leq 20\) 传送门 思路 用 \(dp ...
- 题解-PKUWC2018 随机算法
Problem loj2540 题意简述:给定\(n\)个点的无向图,给定求最大独立集的近似算法:随机排列\(1\cdots n\),按照该排列顺序贪心构造最大独立集(即对每个点能加入独立集就加),求 ...
- LOJ2540 [PKUWC2018] 随机算法 【状压DP】
题目分析: 听说这题考场上能被$ O(4^n) $的暴力水过,难不成出题人是毕姥爷? 首先思考一个显而易见的$ O(n^2*2^n) $的暴力DP.一般的DP都是考虑最近的加入了哪个点,然后删除后递归 ...
- LOJ2540 PKUWC2018 随机算法 状压DP
传送门 两种$DP$: ①$f_{i,j}$表示前$i$次选择,最大独立集为$j$时达到最大独立集的方案总数,转移:$a.f_{i,j}+=f_{i+1,j+2^k}$(保证$k$加入后符合条件):$ ...
- [LOJ2540] [PKUWC2018] 随机算法
题目链接 LOJ:https://loj.ac/problem/2540 Solution 写的时候脑子不太清醒码了好长然后时间\(LOJ\)垫底... 反正随便状压\(dp\)一下就好了,设\(f[ ...
- [LOJ#2540][PKUWC2018]随机算法(概率DP)
场上数据很水,比较暴力的做法都可以过90分以上,下面说几个做法. 1. 暴力枚举所有最大独立集,对每个独立集分别DP.复杂度玄学,但是由于最大独立集并不多,所以可以拿90. 2. dp[S][k]表示 ...
- 【LOJ2540】「PKUWC2018」随机算法
题意 题面 给一个 \(n\) 个点 \(m\) 条边的无向图.考虑如下求独立集的随机算法:随机一个排列并按顺序加点.如果当前点能加入独立集就加入,否则不加入.求该算法能求出最大独立集的概率. \(n ...
- 微信红包中使用的技术:AA收款+随机算法
除夕夜你领到红包了吗?有的说“我领了好几K!”“我领了几W!” 土豪何其多,苦逼也不少!有的说“我出来工作了,没压岁钱了,还要发红包”.那您有去抢微信红包吗?微信群中抢“新年红包”春节爆红.618微信 ...
随机推荐
- 『现学现忘』Docker基础 — 40、发布镜像到Docker Hub
目录 1.准备工作 2.Docker登陆命令 3.Docker提交命令 4.总结: 5.补充:docker tag命令 1.准备工作 Docker Hub地址:https://hub.docker.c ...
- java基础知识点梳理
前言 在别人追问我以下几个问题,自己在问题回答上不够全面和准确,对此自己把专门针对这几个问题进行总结! java相关问题 1.Java中构造方法跟普通方法的区别? 构造方法与普通方法的调用时机不同. ...
- resultMap自定义映射(多对一)
自定义resultMap,处理复杂的表关系,实现高级结果集映射 1) id :用于完成主键值的映射 2) result :用于完成普通列的映射 3) association :一个复杂的类型关联;许多 ...
- chrome请求cgi遇到net::ERR_INCOMPLETE_CHUNKED_ENCODING 200 (OK)
测试一个web demo的时候,通过chrome请求板子上的web server的cgi时总是提示:net::ERR_INCOMPLETE_CHUNKED_ENCODING 200 (OK) 搜遍整个 ...
- Deep Learning-深度学习(二)
深度学习入门 1.随机梯度下降 在之前的学习过程当中,对于损失函数的最为重要的参数的梯度的更新是基于数据集中的所有数据,每一个数据都会进行到计算过程当中去,在本案例中,因为波士顿房价预测这个案例所涉及 ...
- python测试开发django-197.django-celery-beat 定时任务
前言 django-celery-beat 可以支持定时任务,把定时任务写到数据库. 接着前面这篇写python测试开发django-196.python3.8+django2+celery5.2.7 ...
- 如何用空气质量查询API接口进行快速开发
空气质量的好坏反映了空气污染程度,它是依据空气中污染物浓度的高低来判断的.空气污染是一个复杂的现象,在特定时间和地点空气污染物浓度受到许多因素影响.来自固定和流动污染物的人为污染物排放大小是影响空 ...
- RK3568开发笔记(四):在虚拟机上使用SDK编译制作uboot、kernel和buildroot镜像
前言 上一篇搭建好了ubuntu宿主机开发环境,本篇的目标系统主要是开发linux+qt,所以需要刷上billdroot+Qt创建的系统,为了更好的熟悉原理和整个开发过程,选择从零开始搭建rk35 ...
- 串口应用:遵循uart协议,发送多个字节的数据(状态机)
上一节中,我们遵循uart协议,它发送一次只能发送6/7/8位数据,我们不能随意更改位数(虽然在代码上可行),不然就不遵循uart协议了,会造成接收端无法接收. 在现实生活中,我们有时候要发的数据不止 ...
- ajax01_基础知识
ajax请求 ajax概述 组成:asynchronous + javascript + xml 特点: 可发送异步请求(这也是与传统请求方式的区别) 用javascript语言编写代码 前后端数据交 ...