前面的话

这道题显然就是最长反链

根据 \(Dilworth\) 定理:最小链覆盖数 = 最长反链长度

然后传递闭包跑匹配即可

\(luogu\)交了一下,\(WA\) 了

\(QAQ\)

本来各种 \(OJ\) 上都是只要求最长反链,不需要构造方案

虽然原题要构造

然后 \(luogu\) 上的同志写了个 \(SPJ\), 然后 \(luogu\) 就要输出方案了

切不掉很难受

luogu传送门

Sol

先放两个博客:

r_64

某神仙

首先建图后发现最大独立集和最小点覆盖互为补集

而这个图中的最大独立集就是最长反链可能,猜的...(因为两两不可到达)

然后只要知道怎么构造最小点覆盖就好了

第一步

对于一个二分图,这样来做:

先最大匹配

每次从左边找到一个未匹配点增广(假的增广,显然增广不了,因为已经是最大匹配)

然后标记点

最后左边没有标记过的点和右边标记过的点就是最小点覆盖

伪证:因为一条假的增广路一定是左边的点作为开头和结尾的,所以选右边的就能覆盖这个假的增广路

去掉这些点就是要找的最长反链

第二步

找到所有可以出现在最长反链上的点

枚举每个点,删掉它以及可以到达它和它可以到达的点(邻居)

再求最长反链,如果大小减小了 \(1\),这个点就是可以的(显然选这个点不会和当前的集合冲突)

代码


# include <bits/stdc++.h>
# define IL inline
# define RG register
# define Fill(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long ll; IL int Input(){
RG char c = getchar(); RG int x = 0, z = 1;
for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
return x * z;
} const int maxn(205);
const int maxm(1005); int n, m, ans, match[maxn], to[maxn], vis[maxn], idx, f[maxn][maxn], g[maxn][maxn];
int ban[maxn], s[maxn], t[maxn]; IL int Dfs(RG int u){
if(ban[u]) return 0;
for(RG int i = 1; i <= n; ++i)
if(f[u][i] && vis[i] != idx && !ban[i]){
vis[i] = idx;
if(!match[i] || Dfs(match[i])){
to[u] = i, match[i] = u;
return 1;
}
}
return 0;
} IL void Calc(RG int u){
if(s[u]) return;
s[u] = 1;
for(RG int i = 1; i <= n; ++i)
if(f[u][i] && !t[i]) t[i] = 1, Calc(match[i]);
} int main(RG int argc, RG char* argv[]){
n = Input(), m = Input();
for(RG int i = 1; i <= m; ++i) g[Input()][Input()] = 1;
for(RG int i = 1; i <= n; ++i)
for(RG int j = 1; j <= n; ++j)
for(RG int k = 1; k <= n; ++k) g[j][k] |= g[j][i] & g[i][k];
memcpy(f, g, sizeof(f)), ans = n;
for(RG int i = 1; i <= n; ++i) ++idx, ans -= Dfs(i);
printf("%d\n", ans);
for(RG int i = 1; i <= n; ++i) if(!to[i]) Calc(i);
for(RG int i = 1; i <= n; ++i) printf("%d", s[i] && !t[i]);
puts("");
for(RG int nw = 1; nw <= n; ++nw){
for(RG int i = 1; i <= n; ++i) match[i] = to[i] = 0;
RG int ret = 0, nn = 0;
Fill(f, 0), Fill(ban, 0);
for(RG int i = 1; i <= n; ++i)
if(g[i][nw] || g[nw][i] || i == nw) ban[i] = 1;
else ++nn;
ret = nn;
for(RG int i = 1; i <= n; ++i)
for(RG int j = 1; j <= n; ++j)
if(!ban[i] && !ban[j]) f[i][j] = g[i][j];
for(RG int i = 1; i <= n; ++i) if(!ban[i]) ++idx, ret -= Dfs(i);
printf("%d", ret == ans - 1);
}
return 0;
}

[CTSC2008]祭祀(构造方案)的更多相关文章

  1. BZOJ 1143 1143: [CTSC2008]祭祀river 最长反链

    1143: [CTSC2008]祭祀river Description 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动. ...

  2. Bzoj 2718: [Violet 4]毕业旅行 && Bzoj 1143: [CTSC2008]祭祀river 传递闭包,二分图匹配,匈牙利,bitset

    1143: [CTSC2008]祭祀river Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1878  Solved: 937[Submit][St ...

  3. bzoj 1143: [CTSC2008]祭祀river / 2718: [Violet 4]毕业旅行 -- 二分图匹配

    1143: [CTSC2008]祭祀river Time Limit: 10 Sec  Memory Limit: 162 MB Description 在遥远的东方,有一个神秘的民族,自称Y族.他们 ...

  4. BZOJ1143 [CTSC2008]祭祀river 【二分图匹配】

    1143: [CTSC2008]祭祀river Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3236  Solved: 1651 [Submit] ...

  5. bzoj1143(2718)[CTSC2008]祭祀river(最长反链)

    1143: [CTSC2008]祭祀river Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2781  Solved: 1420[Submit][S ...

  6. BZOJ 1143: [CTSC2008]祭祀river 最长反链

    1143: [CTSC2008]祭祀river Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline ...

  7. 1143: [CTSC2008]祭祀river(最长反链)

    1143: [CTSC2008]祭祀river 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1143 Description: 在遥远的 ...

  8. P4298 [CTSC2008]祭祀

    P4298 [CTSC2008]祭祀 传递闭包跑一遍按联通建图 $(1)$最长反链长度=最小链覆盖=n-最大匹配 $(2)$定义作为最大匹配出现在左端点的集合为$S$,作为最大匹配出现在右端点的集合为 ...

  9. 洛谷 P4298: bzoj 1143: [CTSC2008]祭祀

    题目传送门:洛谷 P4298. 题意简述: 给定一个 \(n\) 个点,\(m\) 条边的简单有向无环图(DAG),求出它的最长反链,并构造方案. 最长反链:一张有向无环图的最长反链为一个集合 \(S ...

随机推荐

  1. springMVC请求注解@RequestMapping各个属性值

    最近遇到了一个采用fastJson传输数据的方式,搞了半天,总是感觉模糊,觉得自己有必要在这里做一个系统的总结,今天先从@RequestMapping的属性开始,采用REST 风格的 URL 请求,R ...

  2. iOS关于代码风格问题

    cocoapods管理第三方库,详见cocoapods安装及使用 OC代码风格需要规范,所有第三方依赖需要用cocoapods管理.代码风格需要: 1. pod 'CodeFormatter', :g ...

  3. 开源单点登录系统CAS入门

    一.什么是CAS CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目.CAS 具有以 ...

  4. 洛谷p1208 水题贪心 思想入门

    题目描述 由于乳制品产业利润很低,所以降低原材料(牛奶)价格就变得十分重要.帮助Marry乳业找到最优的牛奶采购方案. Marry乳业从一些奶农手中采购牛奶,并且每一位奶农为乳制品加工企业提供的价格是 ...

  5. [ZJOI2019]语言[树链的并、线段树合并]

    题意 题目链接 分析 考虑枚举每个点的答案,最后除以 2 即可. 可以与 \(u\) 构成合法点对 的集合 为所有经过了 \(u\) 的链的并.因为这些链两两有交,根据结论 "树上两条相交的 ...

  6. 获得自己电脑的SSH公匙

    关于什么是SSH请点击此"www.Baidu.com”网站了解 我这里只说怎么获取属于自己电脑的SSH公匙 本人是Win10电脑 所以相对来说简单一点  点击win ->选择设置-&g ...

  7. Mac 10.12安装OpenVPN客户端

    说明: 1.在Mac下有很多漂亮的客户端可以安装,比如Tunnelblick这些等等. 2.但这里直接先原版的OpenVPN进行搭建,这个比较爽. 安装: brew install openvpn 提 ...

  8. PowerDesigner16 生成的备注脚本,在sql server 2008 中报“对象名 'sysproperties' 无效”的错误的解决办法

    主要是在建模时我们对表.列增加了些说明注释,而Sql2005之后系统表sysproperties已废弃删除而改用sys.extended_properties所致. 1.修改Table TableCo ...

  9. mysql exceeded the 'max_questions' resource 记录

    最近Hive Meta的  Mysql 常报错 'user' has exceeded the 'max_questions' resource (current value: 10000) 解决:调 ...

  10. python2和python3中列表推导式的变量泄露问题

    Python 2.x 中,在列表推导中 for 关键词之后的赋值操作可能会影响列表推导上下文中的同名变量.像下面这个 Python 2.7 控制台对话: Python 2.7.15 (default, ...