最长反链(bzoj 1143: [CTSC2008]祭祀river)
题目描述:
给你一个n个点m条边的有向无环图,求出最大点集满足其中任意两点间都不能存在路径
也就是对于所有的x, y∈S,x不能到达y,y也不能到达x
对于有向无环图(DAG):
链:一些点的集合,链中任意两点x, y,一定满足x能到达y或者y能到达x
反链:一些点的集合,链中任意两点x, y,一定满足x不能到达y,y也不能到达x
而上题显然就是求出最长反链
定理:最长反链 = 最小链覆盖(用最少的链覆盖图中所有的点,即路径可重叠的最小路径覆盖)
这样题目就又转成了求可重叠的最小路径覆盖
对于二分图:
最小点覆盖(每条边都有至少一个点在集合中)= 最大匹配
最小边覆盖(每个点都有至少一个连它的边在集合里 ,如果某点没有边相连就直接+1)= 二分图点数 - 最大匹配
最大独立集(集合中任意两点之间都没有边)= 二分图点数 - 最大匹配
DAG的最小路径覆盖:
将原图的每个点拆成xa,xb两个,分别在二分图的两边,如果原图存在有向边x->y,那么xa到yb连一条边
那么DAG最小路径覆盖(路径不可重叠的) = 原图点数 - 最大匹配
证明:
开始每个点都独立为一条路径,总共有n条不相交路径,在二分图里每加一条边就相当于将两条路径合成了一条
如果二分图中两条边有公共点,那么这两条边就相当于原图中两条到同一个点的边或者从同一个点引出的两条边
显然这两条边一定属于不同路径!
所以说DAG中最小不可重叠路径覆盖可以通过转成二分图求出
而题目中要求的是最小可重叠路径覆盖
那怎么办?
其实很简单,改一下只要x能到达y,那么xa到yb连一条边再求一遍最大匹配就ok了
floyd+二分匹配搞定,复杂度O(n^3)
1143: [CTSC2008]祭祀river
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 3132 Solved: 1606
[Submit][Status][Discuss]
Description
Input
Output
第一行包含一个整数K,表示最多能选取的祭祀点的个数。
Sample Input
Sample Output
就是上面例子那道题
#include<stdio.h>
#include<string.h>
int n, road[105][105], link[105], vis[105];
int Sech(int x)
{int i;for(i=1;i<=n;i++){if(road[x][i] && vis[i]==0){vis[i] = 1;if(link[i]==0 || Sech(link[i])){link[i] = x;return 1;}}}return 0;
}
int main(void)
{int i, j, k, m, x, y, ans;scanf("%d%d", &n, &m);for(i=1;i<=m;i++){scanf("%d%d", &x, &y);road[x][y] = 1;}for(k=1;k<=n;k++){for(i=1;i<=n;i++){for(j=1;j<=n;j++){if(road[i][k] && road[k][j])road[i][j] = 1;}}}ans = 0;for(i=1;i<=n;i++){memset(vis, 0, sizeof(vis));ans += Sech(i);}printf("%d\n", n-ans);return 0;
}
最长反链(bzoj 1143: [CTSC2008]祭祀river)相关推荐
- bzoj 1143: [CTSC2008]祭祀river
Description 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都 会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组 ...
- 1143: [CTSC2008]祭祀river
Time Limit: 10 Sec Memory Limit: 162 MB Submit: 4018 Solved: 2048 [Submit][Status][Discuss] Descri ...
- BZOJ.1143.[CTSC2008]祭祀(Dilworth定理 最大流ISAP)
题目链接 题目是求最长反链,反链指点集内任意两点不能互相到达. 根据Dilworth定理,在DAG中,\[最长反链 = 最小路径覆盖 = V - 最大匹配数\] 用Floyd求一遍传递闭包后,在所有可 ...
- bzoj1143[CTSC2008]祭祀river
bzoj1143[CTSC2008]祭祀river 题意: Y族居住地水系是一个由岔口和河道组成的网络.每条河道连接着两个岔口,并且水在河道内按照一个固定的方向流动.水系中不会有环流.由于人数众多的原 ...
- [bzoj1143][CTSC2008]祭祀river——DAG上最长反链,Dilworth定理,最大二分图匹配,Floyd
题目大意: 给定一个DAG图,求最长反链(即一个点集,其中任意点两两不可以相互到达). 思路: 一开始我其实是想用求最大独立集的方法去求的.但是并不会(好像也过不去). 题目所要求的是最长反链,需要用 ...
- BZOJ1143[CTSC2008]祭祀river 偏序集及Dilworth定理
这里讲一下我对偏序集的认识 如果有偏差可以评论我 我会修改 一:定义 (度娘上copy来的 不想看的可以跳过 设R是非空集合A上的一个二元关系,若R满足: 自反性.反对称性.传递性,则称R为A ...
- [CTSC2008]祭祀river
Description 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典,Y族都会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组成的 ...
- 【bzoj1143】[CTSC2008]祭祀river Floyd+网络流最小割
在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都 会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组成的网络.每条河道连接着 ...
- BZOJ1143: [CTSC2008]祭祀river 网络流_Floyd_最大独立集
Description 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都 会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组 ...
最新文章
- m-orchastration system
- 键盘回车事件导致页面刷新的问题
- PHP中用编码代码,编码对照表的使用(2)_php
- boost::geometry::sym_difference用法的测试程序
- 8.ActionContext类与Servlet API解耦的访问方式
- 数据库原理与应用(SQL Server)笔记 第一章 数据定义语言和数据操纵语言
- 项目 接入 在线预览
- 什么是PV UV PR值
- MongoDB(三):MongoDB概念解析
- 对js运算符“||”和“”的总结
- 【stm32学习】正点原子stm32f103学习——开发板入门
- TCL语言中的执行顺序
- dump日志分析工具
- 幼儿园计算机网络教室工作计划,2017年幼儿园教学工作计划范文
- 写给自己的话:是时候有个计划了,骚年
- VueUse(中文)——简介
- CTF - MISC安全杂项解题事项
- bak文件转oracle文件,如何在Oracle 11g中恢复.bak文件(How to restore .bak file in oracle 11g)...
- STM32F407ZGT6的串口通信
- 操作系统---栈区与堆区 转自:https://blog.csdn.net/amcp9/article/details/79597481
热门文章
- php和python-PHP和Python如何选择?或许可以考虑这三个问题
- python骗局-如何识破python小课骗局_怎样选择学校呢
- 浅谈语音识别技术的发展趋势与应用前景 - 全文
- android usb软件自动安装监控,Android中监控USB的插拔
- Node-ES6模块化
- 【java笔记】缓冲流
- 蓝桥杯笔记:带分数(dfs排列问题)
- LIRe提供的图像检索算法的速度
- openfiledialog选择文件会占用文件_铁皮文件柜的尺寸规格如何选择?选购花都文件柜要注意的问题...
- python安装csv出错_python处理csv文件问题解决贴