『Exclusive Access 2 dilworth定理 状压dp』
<更新提示>
<第一次更新>
<正文>
Exclusive Access 2
Description
给出 N 个点M 条边的无向图,定向得到有向无环图,使得最长路最短。
N ≤ 15, M ≤ 100
Input Format
第一行一个数M (1≤M≤100)。
接下来M行,每行两个大写字母(L 到 Z),最多出线15个不同的大写字母。每行的两个大写字母不会相同。
Output Format
第一行输出最长路最短的数值-1。
Sample Input
3
P Q
Q R
R P
Sample Output
1
解析
二分答案?想多了。
一个结论:有向无环图的最长链点数等于最小的点集划分数使得每个点集中不存在两点有路径。
证明:
由于最长链上的两点必然不能属于同一个点集,所以点集划分数大于等于最长链长度。我们可以每次选出度为零的所有点划分在同一个点集中,若这些点之间有路径,则和他们出度为\(0\)矛盾,所以这样划分一定合法。同时,这样划分的集合数恰为原图的最长链长度。
我们其实变相证明了著名的\(dilworth\)定理:偏序集的最长链等于其最小反链划分。
然后直接枚举点集,状压预处理出其划分方式是否合法,然后枚举子集\(dp\)即可。
\(Code:\)
#include <bits/stdc++.h>
using namespace std;
const int N = 16;
int n,m,a[N][N],p[1<<N],f[1<<N];
vector < pair<char,char> > Link;
map <char,int> Hash;
int main(void)
{
scanf("%d",&m);
for (int i=1;i<=m;i++)
{
char c1,c2;
cin >> c1 >> c2;
Link.emplace_back(c1,c2);
Hash[c1] = Hash[c2] = true;
}
map <char,int> :: iterator it;
for (it=Hash.begin();it!=Hash.end();it++)
it -> second = ++n;
for ( auto e : Link )
a[Hash[e.first]][Hash[e.second]] = a[Hash[e.second]][Hash[e.first]] = 1;
memset( f , 0x3f , sizeof f );
for (int S=1;S<1<<n;S++)
for (int i=1;i<=n;i++)
if ( S >> (i-1) & 1 )
for (int j=i+1;j<=n;j++)
if ( S >> (j-1) & 1 )
p[S] |= a[i][j];
f[0] = 0;
for (int S=1;S<1<<n;S++)
for (int T=S;T;T=S&(T-1))
if ( p[T] == 0 )
f[S] = min( f[S] , f[S^T] + 1 );
printf("%d\n",f[(1<<n)-1]-2);
return 0;
}
<后记>
『Exclusive Access 2 dilworth定理 状压dp』的更多相关文章
- 『数 变进制状压dp』
数 Description 给定正整数n,m,问有多少个正整数满足: (1) 不含前导0: (2) 是m的倍数: (3) 可以通过重排列各个数位得到n. \(n\leq10^{20},m\leq100 ...
- 【Codeforces】Gym 101173B Bipartite Blanket 霍尔定理+状压DP
题意 给一张$n\times m$二分图,带点权,问有多少完美匹配子集满足权值和大于等于$t$ 这里有一个结论:对于二分图$\mathbb{A}$和$\mathbb{B}$集合,如果子集$A \in ...
- bzoj4903 & loj2264 [Ctsc2017]吉夫特 Lucas 定理+状压DP
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4903 https://loj.ac/problem/2264 http://uoj.ac/pr ...
- 『字符合并 区间dp 状压dp』
字符合并 Description 有一个长度为 n 的 01 串,你可以每次将相邻的 k 个字符合并,得到一个新的字符并获得一定分数.得到的新字符和分数由这 k 个字符确定.你需要求出你能获得的最大分 ...
- 解题报告 『[USACO08NOV]Mixed Up Cows(状压动规)』
原题地址 观察数据范围:4 ≤ N ≤ 16. 很明显,这是一道状压DP. 定义:dp[i][j]表示队尾为奶牛i,当前含奶牛的状态为j,共有多少组符合条件的队伍. 代码实现如下: #include ...
- 『公交线路 状压dp 矩阵乘法加速』
公交线路 Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km. 作为公交车线路的规划者,小Z调查了市民的 ...
- HDU 1565&1569 方格取数系列(状压DP或者最大流)
方格取数(2) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- 【XSY2745】装饰地板 状压DP 特征多项式
题目大意 你有\(s_1\)种\(1\times 2\)的地砖,\(s_2\)种\(2\times 1\)的地砖. 记铺满\(m\times n\)的地板的方案数为\(f(m,n)\). 给你\(m, ...
- 【bzoj4903/uoj300】[CTSC2017]吉夫特 数论+状压dp
题目描述 给出一个长度为 $n$ 的序列,求所有长度大于等于2的子序列个数,满足:对于子序列中任意两个相邻的数 $a$ 和 $b$ ($a$ 在 $b$ 前面),${a\choose b}\mod 2 ...
随机推荐
- Java开发桌面程序学习(二)————fxml布局与控件学习
JavaFx项目 新建完项目,我们的项目有三个文件 Main.java 程序入口类,载入界面并显示 Controller.java 事件处理,与fxml绑定 Sample.fxml 界面 sample ...
- C# recording audio based on audio in Console
1. Install-package naudio -v 1.9.0 2. using NAudio.Wave; 3. public class NAudioHelper { public WaveI ...
- Python爬虫反反爬:CSS反爬加密彻底破解!
刚开始搞爬虫的时候听到有人说爬虫是一场攻坚战,听的时候也没感觉到特别,但是经过了一段时间的练习之后,深以为然,每个网站不一样,每次爬取都是重新开始,所以,爬之前谁都不敢说会有什么结果. 前两天,应几个 ...
- centos 7 搭建Samba
一.Samba简介 Samba是一个能让Linux系统应用Microsoft网络通讯协议的软件,由客户端和服务端构成. SMB(Server Message Block的缩写,即服务器消息块)主要是作 ...
- SpringBoot(二):SpringBoot 热部署
1.配置pom: <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g ...
- newSingleThreadScheduledExecutor连续关闭造成 java.util.concurrent.RejectedExecutionException
Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task java.util ...
- JS基础语法---函数---介绍、定义、函数参数、返回值
函数: 把一坨重复的代码封装,在需要的时候直接调用即可 函数的作用: 代码的重用 函数需要先定义,然后才能使用 函数名字:要遵循驼峰命名法 函数一旦重名,后面的会把前面的函数覆盖 Ctrl +鼠标左键 ...
- SQLyog使用期限(治标不治本的,治本的还没找到)
在注册表中找到 HKEY_CURRENT_USER\Software 选中其中的类似下列文件名的文件 HKEY_CURRENT_USER\Software\{d58cb4b1-47f3-45cb ...
- 关于 'chromedriver' executable needs to be in PATH 的解决办法
用 chrome 浏览器跑 selenium,执行以下脚本: from selenium import webdriverdr=webdriver.Chrome()dr.maximize_window ...
- 爬虫 xpath 获取方式
回顾 bs4 实例化bs对象,将页面源码数据加载到该对象中 定位标签:find('name',class_='xxx') findall() select() 将标签中的文本内容获取 string t ...