题意

有一种贪心求最大独立集的算法:

  1. 随机一个排列
  2. 按顺序加入独立集,如果一个点能加入,就加入\({S}\)

给出一张图,问得出正确答案的概率。

\(n \leq 20\)

传送门

思路

用 \(dp[i][s]\) 表示排列集合为 \(i\),最大独立集的大小为 \(s\) 的方案数,\(a[x]\)表示与\(x\)相连的点集。

考虑加入一个可行点,会使与它相连的所有点不能再加入,这些点的排列顺序无关答案,可以直接将他们随便放到后面的排列中去,即乘上\(A(n-count[i]-1,count[a[j]]-count[i \& a[j]]-1)\),将这些点看作已经在排列里了,继续转移

因为对于一个排列集合,我们只需要转移\(s\)最大的即可(小的不可能成为答案),所以复杂度是\(O(n \times 2^n)\)的

#include <bits/stdc++.h>
const int mu=998244353;
int p[25],inv[25],dp[1<<20][21],a[20],n,m,count[1<<20],x,y;
int ksm(int x,int y){
int ans=1;
for (;y;y>>=1,x=x*1ll*x%mu)
if (y&1) ans=ans*1ll*x%mu;
return ans;
}
int A(int x,int y){
return 1ll*p[x]*inv[x-y]%mu;
}
void init(){
p[0]=1;
for (int i=1;i<=20;i++) p[i]=p[i-1]*1ll*i%mu;
inv[20]=ksm(p[20],mu-2);
for (int i=20;i>=0;i--) inv[i-1]=inv[i]*1ll*i%mu;
for (int i=1;i<1<<n;i++)
count[i]=count[i>>1]+(i&1);
}
int main(){
scanf("%d%d",&n,&m);
for (int i=0;i<n;i++) a[i]|=(1<<i);
for (int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
x--,y--;
a[x]|=(1<<y),a[y]|=(1<<x);
}
init();
dp[0][0]=1;
for (int i=0;i<(1<<n)-1;i++)
for (int k=count[i];k>=0;k--){
int t=dp[i][k];
if (!t) continue;
for (int j=0;j<n;j++){
if (i&(1<<j)) continue;
int u=i|a[j];
dp[u][k+1]=(dp[u][k+1]+t*1ll*A(n-count[i]-1,count[a[j]]-count[i&a[j]]-1))%mu;
}
break;
}
for (int i=n;i>=1;i--)
if (dp[(1<<n)-1][i]){
printf("%d\n",dp[(1<<n)-1][i]*1ll*inv[n]%mu);
return 0;
}
}

后记

为什么我有点迷糊pku的难度??今年sc是迷惑行为吗??

LG5492 [PKUWC2018]随机算法的更多相关文章

  1. [PKUWC2018]随机算法

    题意:https://loj.ac/problem/2540 给定一个图(n<=20),定义一个求最大独立集的随机化算法 产生一个排列,依次加入,能加入就加入 求得到最大独立集的概率 loj25 ...

  2. 【洛谷5492】[PKUWC2018] 随机算法(状压DP)

    点此看题面 大致题意: 用随机算法求一张图的最大独立集:每次随机一个排列,从前到后枚举排列中的点,如果当前点加入点集中依然是独立集,就将当前点加入点集中,最终得到的点集就是最大独立集.求这个随机算法的 ...

  3. 题解-PKUWC2018 随机算法

    Problem loj2540 题意简述:给定\(n\)个点的无向图,给定求最大独立集的近似算法:随机排列\(1\cdots n\),按照该排列顺序贪心构造最大独立集(即对每个点能加入独立集就加),求 ...

  4. LOJ2540 [PKUWC2018] 随机算法 【状压DP】

    题目分析: 听说这题考场上能被$ O(4^n) $的暴力水过,难不成出题人是毕姥爷? 首先思考一个显而易见的$ O(n^2*2^n) $的暴力DP.一般的DP都是考虑最近的加入了哪个点,然后删除后递归 ...

  5. LOJ2540 PKUWC2018 随机算法 状压DP

    传送门 两种$DP$: ①$f_{i,j}$表示前$i$次选择,最大独立集为$j$时达到最大独立集的方案总数,转移:$a.f_{i,j}+=f_{i+1,j+2^k}$(保证$k$加入后符合条件):$ ...

  6. [LOJ2540] [PKUWC2018] 随机算法

    题目链接 LOJ:https://loj.ac/problem/2540 Solution 写的时候脑子不太清醒码了好长然后时间\(LOJ\)垫底... 反正随便状压\(dp\)一下就好了,设\(f[ ...

  7. [LOJ#2540][PKUWC2018]随机算法(概率DP)

    场上数据很水,比较暴力的做法都可以过90分以上,下面说几个做法. 1. 暴力枚举所有最大独立集,对每个独立集分别DP.复杂度玄学,但是由于最大独立集并不多,所以可以拿90. 2. dp[S][k]表示 ...

  8. 【LOJ2540】「PKUWC2018」随机算法

    题意 题面 给一个 \(n\) 个点 \(m\) 条边的无向图.考虑如下求独立集的随机算法:随机一个排列并按顺序加点.如果当前点能加入独立集就加入,否则不加入.求该算法能求出最大独立集的概率. \(n ...

  9. 微信红包中使用的技术:AA收款+随机算法

    除夕夜你领到红包了吗?有的说“我领了好几K!”“我领了几W!” 土豪何其多,苦逼也不少!有的说“我出来工作了,没压岁钱了,还要发红包”.那您有去抢微信红包吗?微信群中抢“新年红包”春节爆红.618微信 ...

随机推荐

  1. sql server中:isnull(列名,0) 和isnull(列名,0)<>0 的区别

    1.isnull(参数1,参数2),判断参数1是否为NULL,如果是,返回参数2,否则返回参数1. 2.isnull(列名,0),isnull()函数是用来判断列名是否为null,如果为NUll,则返 ...

  2. win7实现tensorflow中的物体识别

    实现条件: 1.win7 2.python 3.运行所需要的库:matplotlib.lxml.pillow.Cython 具体参考:https://github.com/tensorflow/mod ...

  3. java SE,EE,ME区别

    Java SE(Java Platform,Standard Edition):java平台标准版: Java EE(Java Platform.Enterprise Edition):java平台企 ...

  4. html中标签的英文含义!

    html中的标签缩写的英文是什么?  标签  英文全称  含义 ul unordered lists 无序列表 li list item 列表项目 ol ordered lists 有序列表 dl d ...

  5. 基于【 建造者模式】一 || 网关zuul过滤器封装

    一.springcloud的zuul网关拦截 1.黑名单拦截 2.参数验签 3.Api接口权限验证 二.网关拦截实现方式 1.继承ZuulFilter方法,实现业务逻辑 @Component @Slf ...

  6. iOS testflight 使用说明

    一.告知开发者苹果手机的账户邮箱 1.通过任何形式告知即可 2.下载testflight 二.开发者发送激活邮件到测试者的账户邮箱 1.进入邮箱查看邮件点击 Accept invitation 进行下 ...

  7. 碰撞器Colider 触发器

    碰撞器可以让所依附的游戏物件对其他碰撞体产生碰撞行为(其他游戏物体必须具有Rigidbody组件) 对于不规则形状的物体,通常使用组合式碰撞体而不是网格碰撞器,以为网格碰撞器以模型的网格为基础,更为复 ...

  8. MySql 学习之 一条更新sql的执行过程

    上一篇文章咱们说了一条查询sql的执行过程.如果没有看过上一篇文章的可以去看下上一篇文章,今天咱们说说一条更新sql的执行过程. 上面一条sql是将id为1的分数加上10. 那么它的执行流程是怎样的呢 ...

  9. Linux有名管道的 阻塞VS非阻塞 读写

    参考文章: 关于有名管道open时阻塞的问题 Linux有名管道(FIFO)的阻塞和非阻塞读写 挖坑,日后填

  10. C++——调用优化

    原始代码 #include<iostream> using namespace std; class Test { public: //以参数列表形式对数据成员进行初始化 Test() : ...