题意

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

  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. [转]Entity Framework 异常: 'OFFSET' 附近有语法错误。\r\n在 FETCH 语句中选项 NEXT 的用法无效

    https://blog.csdn.net/weixin_34321977/article/details/85850064 在使用 EF 的时候,突然发现更新后在服务器中运行出错,异常信息主要包含以 ...

  2. 利用python爬取王者荣耀英雄皮肤图片

    前两天看到同学用python爬下来LOL的皮肤图片,感觉挺有趣的,我也想试试,于是决定来爬一爬王者荣耀的英雄和皮肤图片. 首先,我们找到王者的官网http://pvp.qq.com/web201605 ...

  3. C语言中参数的传递

    普通情况: 调用函数参数的传递,是采取入栈的方式,先上图一张: Fun是被调用的函数,而为了演示其参数传递的过程,特意多设了几个参数,其传递参数的汇编代码如下: 可以看出,汇编代码中将这9个参数的前5 ...

  4. MNIST手写数据集在运行中出现问题解决方案

    今天在运行手写数据集的过程中,出现一个问题,代码没有问题,但是运行的时候一直报错,错误如下: urllib.error.URLError: <urlopen error [SSL: CERTIF ...

  5. 【DRF框架】路由组件

    视图组件涉及的路由补充: from rest_framework.viewsets import ViewSetMixin 对路由进行了重新的分发,重写了as_view() 方法,重新封装了请求方法 ...

  6. 分组函数(groupby、itemgetter)

    from itertools import groupby from operator import itemgetter d1={'name':'liuyi','age':25,'city':'SZ ...

  7. Linux命令——su 、su -、sudo

    前言 大部分Linux发行版的默认账户是普通用户,而更改系统文件或者执行某些命令,需要root身份才能进行,这就需要从当前用户切换到root用户. 切换用户身份有两个命令 su [-] usernam ...

  8. 管理Linux软件——aptitude

    https://help.ubuntu.com/lts/serverguide/aptitude.html.en

  9. 第五次个人作业---Alpha2项目测试

    这个课程属于哪个课程 <课程的链接> 作业的要求 <作业要求的链接> 团队名称 <团队名称:六扇门编程团队> 作业的目标 从一个普通用户的角度,在测试其他团队项目的 ...

  10. 日常2018/4/9---b/s和c/s架构分别是什么?区别?

    b/s和c/s架构分别是什么?区别? b/s是指前后端分别是 Browser/Server的模式.(3层c/s模式) c/s是指前后端分别是 Client/Server的模式.(2层c/s模式) c/ ...