[CTSC2008]祭祀(构造方案)
前面的话
这道题显然就是最长反链
根据 \(Dilworth\) 定理:最小链覆盖数 = 最长反链长度
然后传递闭包跑匹配即可
\(luogu\)交了一下,\(WA\) 了
\(QAQ\)
本来各种 \(OJ\) 上都是只要求最长反链,不需要构造方案
虽然原题要构造
然后 \(luogu\) 上的同志写了个 \(SPJ\), 然后 \(luogu\) 就要输出方案了
切不掉很难受
Sol
先放两个博客:
首先建图后发现最大独立集和最小点覆盖互为补集
而这个图中的最大独立集就是最长反链可能,猜的...(因为两两不可到达)
然后只要知道怎么构造最小点覆盖就好了
第一步
对于一个二分图,这样来做:
先最大匹配
每次从左边找到一个未匹配点增广(假的增广,显然增广不了,因为已经是最大匹配)
然后标记点
最后左边没有标记过的点和右边标记过的点就是最小点覆盖
伪证:因为一条假的增广路一定是左边的点作为开头和结尾的,所以选右边的就能覆盖这个假的增广路
去掉这些点就是要找的最长反链
第二步
找到所有可以出现在最长反链上的点
枚举每个点,删掉它以及可以到达它和它可以到达的点(邻居)
再求最长反链,如果大小减小了 \(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]祭祀(构造方案)的更多相关文章
- BZOJ 1143 1143: [CTSC2008]祭祀river 最长反链
1143: [CTSC2008]祭祀river Description 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动. ...
- 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 ...
- bzoj 1143: [CTSC2008]祭祀river / 2718: [Violet 4]毕业旅行 -- 二分图匹配
1143: [CTSC2008]祭祀river Time Limit: 10 Sec Memory Limit: 162 MB Description 在遥远的东方,有一个神秘的民族,自称Y族.他们 ...
- BZOJ1143 [CTSC2008]祭祀river 【二分图匹配】
1143: [CTSC2008]祭祀river Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3236 Solved: 1651 [Submit] ...
- bzoj1143(2718)[CTSC2008]祭祀river(最长反链)
1143: [CTSC2008]祭祀river Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2781 Solved: 1420[Submit][S ...
- BZOJ 1143: [CTSC2008]祭祀river 最长反链
1143: [CTSC2008]祭祀river Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline ...
- 1143: [CTSC2008]祭祀river(最长反链)
1143: [CTSC2008]祭祀river 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1143 Description: 在遥远的 ...
- P4298 [CTSC2008]祭祀
P4298 [CTSC2008]祭祀 传递闭包跑一遍按联通建图 $(1)$最长反链长度=最小链覆盖=n-最大匹配 $(2)$定义作为最大匹配出现在左端点的集合为$S$,作为最大匹配出现在右端点的集合为 ...
- 洛谷 P4298: bzoj 1143: [CTSC2008]祭祀
题目传送门:洛谷 P4298. 题意简述: 给定一个 \(n\) 个点,\(m\) 条边的简单有向无环图(DAG),求出它的最长反链,并构造方案. 最长反链:一张有向无环图的最长反链为一个集合 \(S ...
随机推荐
- Dubbo 自定义异常,你是怎么处理的?
前言 记录Dubbo对于自定义异常的处理方式. 实现目标 服务层异常,直接向上层抛出,web层统一捕获处理 如果是系统自定义异常,则返回{"code":xxx,"msg& ...
- the type initializer for 'system.drawingcore.gdiplus' threw an exception
Centos 7 yum install libgdiplus-devel reboot之后生效 apt install libgdiplus cp /usr/lib/libgdiplus.so ~/ ...
- How to manage local libraries in IntelliJ IDEA
如何在 IntelliJ IDEA 中管理本地类库 一般来说,如果项目是基于 Maven 管理工具的,我们会在 pom.xml 中添加 dependency 来管理依赖.但有时也会遇到要用的类库不在 ...
- python里有意思的文件查找glob模块
python标准库之glob介绍 glob 文件名模式匹配,不用遍历整个目录判断每个文件是不是符合. 1.通配符 星号(*)匹配零个或多个字符 import glob for name in glob ...
- windows下vim中文乱码处理
现象:gvim安装后,打开中文utf-8编码的文件中文显示乱码 处理:1.启动gvim8.0,菜单 ”编辑“->"启动设定"在文件最开始处添加如下两行set fileenco ...
- excel 快速填充所有非连续空白单元格
工作中经常会碰到这样的表,需要把空白的单元格填充完成.变成后图.下面就是方法. 工具/原料 EXCEL 方法/步骤 首先选中你要填充的区域, 按“F5"或者 Ctrl + ...
- Android开发最佳实践
Android开发最佳实践 摘要 ●使用 Gradle 和它推荐的工程结构 ●把密码和敏感数据放在gradle.properties ●不要自己写 HTTP 客户端,使用Volley或OkHttp库 ...
- Fetch使用方法
前言: fetch是用来取代传统的XMLHttpRequest的. 它的优点很多,包括链式调用的语法.返回promise等. 什么是fetch? fetch api是基于promise的设计,它是为了 ...
- Java LinkedHashMap 逆序遍历
利用 ListIterator<pre name="code" class="java">previous import java.util.Arr ...
- 再学C/C++ 之 指针常量 和 常量指针
(1)指针常量,将指针的指向当成常量.即指针变量的值只能在定义的时候初始化,定义后不能修改,也就是说不能改变指针变量的指向.但是不影响所指对象的访问特征.其定义形式为: 类型 * const 指针 / ...