<更新提示>

<第一次更新>


<正文>

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』的更多相关文章

  1. 『数 变进制状压dp』

    数 Description 给定正整数n,m,问有多少个正整数满足: (1) 不含前导0: (2) 是m的倍数: (3) 可以通过重排列各个数位得到n. \(n\leq10^{20},m\leq100 ...

  2. 【Codeforces】Gym 101173B Bipartite Blanket 霍尔定理+状压DP

    题意 给一张$n\times m$二分图,带点权,问有多少完美匹配子集满足权值和大于等于$t$ 这里有一个结论:对于二分图$\mathbb{A}$和$\mathbb{B}$集合,如果子集$A \in ...

  3. bzoj4903 & loj2264 [Ctsc2017]吉夫特 Lucas 定理+状压DP

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4903 https://loj.ac/problem/2264 http://uoj.ac/pr ...

  4. 『字符合并 区间dp 状压dp』

    字符合并 Description 有一个长度为 n 的 01 串,你可以每次将相邻的 k 个字符合并,得到一个新的字符并获得一定分数.得到的新字符和分数由这 k 个字符确定.你需要求出你能获得的最大分 ...

  5. 解题报告 『[USACO08NOV]Mixed Up Cows(状压动规)』

    原题地址 观察数据范围:4 ≤ N ≤ 16. 很明显,这是一道状压DP. 定义:dp[i][j]表示队尾为奶牛i,当前含奶牛的状态为j,共有多少组符合条件的队伍. 代码实现如下: #include ...

  6. 『公交线路 状压dp 矩阵乘法加速』

    公交线路 Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km. 作为公交车线路的规划者,小Z调查了市民的 ...

  7. HDU 1565&1569 方格取数系列(状压DP或者最大流)

    方格取数(2) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  8. 【XSY2745】装饰地板 状压DP 特征多项式

    题目大意 你有\(s_1\)种\(1\times 2\)的地砖,\(s_2\)种\(2\times 1\)的地砖. 记铺满\(m\times n\)的地板的方案数为\(f(m,n)\). 给你\(m, ...

  9. 【bzoj4903/uoj300】[CTSC2017]吉夫特 数论+状压dp

    题目描述 给出一个长度为 $n$ 的序列,求所有长度大于等于2的子序列个数,满足:对于子序列中任意两个相邻的数 $a$ 和 $b$ ($a$ 在 $b$ 前面),${a\choose b}\mod 2 ...

随机推荐

  1. python免密远程执行shell

    使用paramiko库:https://github.com/paramiko/paramiko 简单封装SSH类 import paramiko class SSH: def __init__(se ...

  2. UserControl关闭

    直接 Application.Current.Shutdown();关闭程序.

  3. Python使用数字与字符串的技巧

    1.少写数字字面量 "数字字面量(integer literal)" 是指那些直接出现在代码里的数字.它们分布在代码里的各个角落,比如代码 del users[0] 里的 0 就是 ...

  4. Taro多端自定义导航栏Navbar+Tabbar实例

    运用Taro实现多端导航栏/tabbar实例 (H5 + 小程序 + React Native) 最近一直在捣鼓taro开发,虽说官网介绍支持编译到多端,但是网上大多数实例都是H5.小程序,很少有支持 ...

  5. 1041. Robot Bounded In Circle

    本题题意: 一开始一个机器人站在了(0,0)上,面朝的方向是北,收到三个序列G,L,R. G:直走 L:向左转 R:向右转 按序执行,永远重复. 返回TRUE,如果处在一个圈. 第一个卡住的点: 1. ...

  6. Ajax错误

    如果ajax访问不到后台对应的controller的方法,直接报错,首先查看url访问路径,如果路径没错误,再利用谷歌开发者工具来运行一下,是否存在基本语法错误,比如字符写错了,多一个少一个逗号, 如 ...

  7. MySQL获取指定字段不重复的记录

    关键词:DISTINCT 1.比如数据库一组数据查询如下,返回店铺下所有的区域id 2.SQL统计返回指定字段 district 不重复的 记录id,SQL如下 SELECT DISTINCT(dis ...

  8. 查看sybase IQ的执行计划

    在性能调优工作中,首要的事情是找出性能瓶颈.而针对数据库应用,由于商用数据库对上层应用来说是个黑盒,所以往往需要借助数据库的一些接口或工具来了解数据库的具体行为,并结合相关知识和业务进行调测.    ...

  9. 震惊,用了这么多年的 CPU 利用率,其实是错的

    导读:本文翻译自 Brendan Gregg 去年的一片博客文章 "CPU Utilization is Wrong",从标题就能想到这篇文章将会引起争议.文章一上来就说,我们&q ...

  10. emacs 矩形操作

    emacs 矩形操作 如果使用图形化(GUI)的eamcs,使用M-x cua-mode,很好用,但是如果不是图形化的emacs(emacs -nw)的话,矩形操作就不能使用cua-mode. 非图形 ...