我们考虑用状压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】随机算法的更多相关文章

  1. [PKUWC2018]随机算法

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

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

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

  3. LG5492 [PKUWC2018]随机算法

    题意 有一种贪心求最大独立集的算法: 随机一个排列 按顺序加入独立集,如果一个点能加入,就加入\({S}\) 给出一张图,问得出正确答案的概率. \(n \leq 20\) 传送门 思路 用 \(dp ...

  4. 题解-PKUWC2018 随机算法

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

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

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

  6. LOJ2540 PKUWC2018 随机算法 状压DP

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

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

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

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

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

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

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

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

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

随机推荐

  1. windows下telnet的用法

    前言 这里利用Windows7下如何使用Telnet命令给大家总结如下: 第一步:在控制面板里,点击"程序"选项 第二步:在程序选项下,点击"打开或关闭Windows功能 ...

  2. 用python这样做,offer还不是拿到手软?

    大家好鸭,我是小熊猫 本篇代码提供者: 自游老师 老师简介:青灯教育金牌讲师3年Python爬虫开发经验七年在线教育经验擅长Python.c等语言曾任职多家互联网公司爬虫工程师.Python讲师 [环 ...

  3. python常见的错误提示处理

    python常见的错误有 NameError变量名错误 IndentationError代码缩进错误 AttributeError对象属性错误 TypeError类型错误 IOError输入输出错误 ...

  4. colab运行.py文件

    !python split_data.py

  5. labview入门到出家10(进阶)——CAN通讯

    ​          讲完串口,这边再讲一个labveiw工控程序中比较常用的CAN通讯吧.很久没有写过CAN通讯的程序了,网上一搜就是什么现场总线,控制器局域网总线,然后一堆复杂的协议.在这里还是一 ...

  6. 使用vs2022编译assimp,并基于OpenGL加载模型

    Assimp :全称为Open Asset Import Library,这是一个模型加载库,可以导入几十种不同格式的模型文件(同样也可以导出部分模型格式).只要Assimp加载完了模型文件,我们就可 ...

  7. MATLAB复习资料——浙商大管工学院适用

    包含12套复习卷,课堂PPT 下载链接:MATLAB练习模拟题库(12套).pdf - 蓝奏云 (lanzoub.com)

  8. 如何在Excel批量查询电话号码归属地?

    手机号码归属地的重要性大家应该都清楚,如果取消或者更改手机号码归属地,那么一会增加用户的被诈骗风险;二是对套餐资费会产生影响,加剧企业间的竞争,加剧数字鸿沟;三是企业运营管理需要投入大量人力物力,是个 ...

  9. jdbc 02: 连接mysql,并实现删除与更新

    jdbc连接mysql,并实现删除与更新 package com.examples.jdbc.o2_删除与更新; import java.sql.*; //连接与插入 /* jdbc删除操作 */ p ...

  10. 一张图进阶 RocketMQ - 消息存储

    前言 三此君看了好几本书,看了很多遍源码整理的 一张图进阶 RocketMQ 图片,关于 RocketMQ 你只需要记住这张图!觉得不错的话,记得点赞关注哦. [重要]视频在 B 站同步更新,欢迎围观 ...