[BZOJ 1143] [CTSC2008] 祭祀river 【最长反链】
题目链接:BZOJ - 1143
题目分析
这道题在BZOJ上只要求输出可选的最多的祭祀地点个数,是一道求最长反链长度的裸题。
下面给出一些相关知识:
在有向无环图中,有如下的一些定义和性质:
链:一条链是一些点的集合,链上任意两个点x, y,满足要么 x 能到达 y ,要么 y 能到达 x 。
反链:一条反链是一些点的集合,链上任意两个点x, y,满足 x 不能到达 y,且 y 也不能到达 x。
那么很显然这道题就是求最长反链长度了。
一个定理:最长反链长度 = 最小链覆盖(用最少的链覆盖所有顶点)
对偶定理:最长链长度 = 最小反链覆盖
那么我们要求出的就是这个有向无环图的最小链覆盖了。最小链覆盖也就是路径可以相交的最小路径覆盖。
我们先来看路径不能相交的最小路径覆盖怎么来做:
建立一个二分图,两边都是n个点,原图的每个点 i 对应两个,在左边的叫做 i1, 在右边的叫做 i2 。
然后原图中如果存在一条边 (x, y),那么就在二分图中建立 (x1, y2) 的边。
这样建立二分图之后,原图的点数 n - 二分图最大匹配 = 原图的最小路径覆盖(路径不能相交)。
这样为什么是对的呢?我们可以认为,开始时原图的每个点都是独立的一条路径,然后我们每次在二分图中选出一条边,就是将两条路径连接成一条路径,答案数就减少1。
而路径是不能相交的,所以我们在二分图中选出的边也是不能相交的,所以就是二分图的最大匹配。
了解了路径不能相交的最小路径覆盖之后,怎么解路径可以相交的最小路径覆盖(也就是最小链覆盖)呢?
我们将原图做一次Floyd传递闭包,之后就可以知道任意两点 x, y,x 是否能到达 y。
如果两个点 x, y,满足 x 可以到达 y ,那么就在二分图中建立边 (x1, y2) 。
这样其实就是相当于将原图改造了一下,只要 x 能到达 y ,就直接连一条边 (x, y),这样就可以“绕过”原图的一些被其他路径占用的点,直接构造新路径了。
这样就将可以相交的最小路径覆盖转化为了路径不能相交的最小路径覆盖了。
另外有一个最长反链=最小链覆盖的例子,NOIP1999 导弹拦截,第二问实质上就是求最小链覆盖,转化为最长反链来求,当然当时我写那道题的时候就是看题解,根本不知道这是求最长反链= =
代码
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <algorithm> using namespace std; const int MaxN = 100 + 5; int n, m, Ans, Index;
int Used[MaxN * 2], Father[MaxN * 2]; bool OK[MaxN][MaxN]; struct Edge
{
int v;
Edge *Next;
} E[MaxN * MaxN], *P = E, *Point[MaxN]; inline void AddEdge(int x, int y)
{
++P; P -> v = y;
P -> Next = Point[x]; Point[x] = P;
} bool Find(int x)
{
for (Edge *j = Point[x]; j; j = j -> Next)
{
if (Used[j -> v] == Index) continue;
Used[j -> v] = Index;
if (Father[j -> v] == 0 || Find(Father[j -> v]))
{
Father[j -> v] = x;
return true;
}
}
return false;
} int main()
{
scanf("%d%d", &n, &m);
int a, b;
for (int i = 1; i <= m; ++i)
{
scanf("%d%d", &a, &b);
OK[a][b] = true;
}
for (int k = 1; k <= n; ++k)
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
OK[i][j] = OK[i][j] || (OK[i][k] && OK[k][j]);
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
if (OK[i][j]) AddEdge(i, n + j);
Index = 0;
Ans = 0;
for (int i = 1; i <= n; ++i)
{
++Index;
if (Find(i)) ++Ans;
}
Ans = n - Ans;
printf("%d\n", Ans);
return 0;
}
[BZOJ 1143] [CTSC2008] 祭祀river 【最长反链】的更多相关文章
- BZOJ 1143: [CTSC2008]祭祀river 最长反链
1143: [CTSC2008]祭祀river Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline ...
- 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(2718)[CTSC2008]祭祀river(最长反链)
1143: [CTSC2008]祭祀river Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2781 Solved: 1420[Submit][S ...
- bzoj1143: [CTSC2008]祭祀river 最长反链
题意:在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组成的网络.每条河道连 ...
- [BZOJ1143][CTSC2008]祭祀river(最长反链)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1143 分析: 最长反链==最小路径覆盖==n-二分图最大匹配数 某神犇对二分图的总结: ...
- [BZOJ]1143: [CTSC2008]祭祀river
题目大意:给定一个n个点m条边的有向无环图,问最多选多少个点使得两两之间互不到达.(n<=100,m<=1000) 思路:题目所求即最长反链,最长反链=最小链覆盖,对每个点向自己能到的所有 ...
- BZOJ 1143: [CTSC2008]祭祀river 最大独立集
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1143 题解: 给你一个DAG,求最大的顶点集,使得任意两个顶点之间不可达. 把每个顶点v ...
随机推荐
- jdk1.5多线程Lock接口及Condition接口
jdk1.5多线程的实现的方式: jdk1.5之前对锁的操作是隐式的 synchronized(对象) //获取锁 { } //释放锁 jdk1.5锁的操作是显示的:在包java.util.concu ...
- android之frame动画详解
上一篇我们说了android中的tween动画,这一篇我们说说frame动画,frame动画主要是实现了一种类似于gif动画的效果,就是多张图按预先设定好的时间依次连续显示. 新建一个android项 ...
- CentOS 6.7 配置nginx支持SSL/https访问
一.安装必要的包 yum install openssl openssl-devel 二.配置编译参数,增加对SSL的支持 ./configure –with-http_ssl_module 三.修改 ...
- codeforces 132C Logo Turtle(dp)
可以用三维dp来保存状态, dp[i][j][k]表示在前i个字符变换了j步之后方向为k(k = 1 or k = 0)的最优解,也就是离原点的最大距离.这里规定0方向为正方向,1位负方向,表示的是当 ...
- get方式请求会出现中文乱码。post方式不会。
get方式请求会出现中文乱码.post方式不会. 如果是要解决get方式中文乱码问题,就需要做一个拦截器,或者在web.xml做一个get请求的配置 来自为知笔记(Wiz)
- 动态添加JS文件到页面
/*** ** 功能: 加载外部JS文件,加载完成后执行回调函数callback ***/ var utools = { config: { id: "", url: " ...
- everything is nothing
可以选ios,可以选择android ,可以选择javaee,因为不想让自己这段时间的努力没有一个完美的结局.最起码真的能做点东西出来,所以6.10--8.10,两个月把javaee实训的该准备.可以 ...
- Asp.net: WebForm基础上构建Mvc的方法
添加引用: System.Web.Routing System.Web.Abstractions System.Web.Mvc 添加文件夹: Controllers, Views, Views / ...
- google map 定位
在map初始化的过程中,得到当前经纬度,完成初始化地图,通过HTML5中的Geolocation实现,具体参考:http://www.jb51.net/html5/71556.html 1.获取当前地 ...
- 如何获得Windows 8中已记住的WIFI的明文密码
网上很流行的一种查看WIFI密码明文的方法,如下: 今天遇到了一种状况,就是如果不连WIFI的情况我能抓到这个密码吗?(实在不想开口问同事密码多少,只能苦逼的自己想办法了o(︶︿︶)o ) 答案当然是 ...