主要是做个笔记

DAG 最长反链 = 最小链覆盖

反链:反链上任意两个点 $(u,v)$ ,$u$ 不能到 $v$,$v$ 也不能到 $u$

最小链覆盖:选出若干可以相交的链,覆盖整张图,注意与“最小路径覆盖”(不能相交)的区别

最小链覆盖求法:先传递闭包,即做一遍 floyd 求出任意两点 $(u,v)$ 的连通关系,然后建立二分图,如果 $i$ 可以到 $j$,建立边 $(i,j+n)$,求二分图最大匹配,记匹配数为 $ans$,则答案为 $n-ans$

顺便,最小路径(不能相交)覆盖的求法就是不传递闭包直接匹配

DAG 最长反链 = 可以相交可以相交可以相交可以相交可以相交可以相交可以相交可以相交可以相交可以相交可以相交

bzoj1143 求最长反链

#include<bits/stdc++.h>
#define LL long long
using namespace std;
inline int read()
{
int x = ,f = ;char ch = getchar();
for(;!isdigit(ch);ch = getchar())if(ch == '-') f = -f;
for(;isdigit(ch);ch = getchar())x = * x + ch - '';
return x * f;
}
const int maxn = ;
#define oo 2147483647
struct Dinic
{
int n,m,s,t;
int head[maxn],cur[maxn],dis[maxn],nx[maxn];
queue<int> q;
struct Edge
{
int from, to,caps;
Edge(){}
Edge(int _from, int _to, int _caps){from = _from, to = _to, caps = _caps;}
}es[maxn];
Dinic(){memset(head,-,sizeof(head));}
void AddEdge(int u, int v, int w)
{
es[m] = Edge(u, v, w);nx[m] = head[u];head[u] = m;m++;
es[m] = Edge(v, u, );nx[m] = head[v];head[v] = m;m++;
}
bool BFS()
{
memset(dis,,sizeof(dis));
dis[t] = ;q.push(t);
while(!q.empty())
{
int now = q.front();q.pop();
for(int i = head[now]; ~i; i = nx[i])
{
Edge &e = es[i^];
if(e.caps && !dis[e.from])
{
dis[e.from] = dis[now] + ;
q.push(e.from);
}
}
}
return dis[s] > ;
}
int DFS(int u,int a)
{
if(u == t || !a)return a;
int flow, f = ;
for(int& i = cur[u]; ~i; i = nx[i])
{
Edge &e = es[i];
if(dis[e.to] == dis[u] - && (flow = DFS(e.to,min(e.caps,a))))
{
f += flow;
a -= flow;
e.caps -= flow;
es[i^].caps += flow;
if(!a)return f;
}
}
return f;
}
int MaxFlow(int _s,int _t)
{
s = _s,t = _t;
int ans = ;
while(BFS())
{
memcpy(cur,head,sizeof(head));
ans += DFS(s,oo);
}return ans;
}
} sol;
int n,m,s,t;
int mp[][];
int main()
{
n = read(),m = read();
for(int i=,x,y;i<=m;i++)x = read(),y = read(),mp[x][y] = ;
for(int k=;k<=n;k++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)mp[i][j] |= (mp[i][k] & mp[k][j]);
s = n+n+,t = n+n+;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(mp[i][j])
sol.AddEdge(i, j+n, );
for(int i=;i<=n;i++) sol.AddEdge(s, i, ),sol.AddEdge(i+n, t, );
int ans = n - sol.MaxFlow(s,t);
cout << ans << endl;
}

Dilworth 定理的更多相关文章

  1. 【codevs1044】导弹拦截问题与Dilworth定理

    题目描述 Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某 ...

  2. 偏序集的Dilworth定理

    定理1 令(X,≤)是一个有限偏序集,并令r是其最大链的大小.则X可以被划分成r个但不能再少的反链.其对偶定理称为Dilworth定理:定理2 令(X,≤)是一个有限偏序集,并令m是反链的最大的大小. ...

  3. hdu1051(LIS | Dilworth定理)

    这题根据的Dilworth定理,链的最小个数=反链的最大长度 , 然后就是排序LIS了 链-反链-Dilworth定理 hdu1051 #include <iostream> #inclu ...

  4. (转载)偏序集的Dilworth定理学习

    导弹拦截是一个经典问题:求一个序列的最长不上升子序列,以及求能最少划分成几组不上升子序列.第一问是经典动态规划,第二问直接的方法是最小路径覆盖, 但是二分图匹配的复杂度较高,我们可以将其转化成求最长上 ...

  5. codevs1044:dilworth定理

    http://www.cnblogs.com/submarine/archive/2011/08/03/2126423.html dilworth定理的介绍 题目大意:求一个序列的lds 同时找出这个 ...

  6. BZOJ.4160.[NEERC2009]Exclusive Access 2(状压DP Dilworth定理)

    BZOJ DAG中,根据\(Dilworth\)定理,有 \(最长反链=最小链覆盖\),也有 \(最长链=最小反链划分数-1\)(这个是指最短的最长链?并不是很确定=-=),即把所有点划分成最少的集合 ...

  7. 【XSY2727】Remove Dilworth定理 堆 树状数组 DP

    题目描述 一个二维平面上有\(n\)个梯形,满足: 所有梯形的下底边在直线\(y=0\)上. 所有梯形的上底边在直线\(y=1\)上. 没有两个点的坐标相同. 你一次可以选择任意多个梯形,必须满足这些 ...

  8. 【BZOJ3997】【TJOI2015】组合数学 Dilworth定理 DP

    题目描述 有一个\(n\times m\)的网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右走.问至少走多少次才能将财宝捡完. 此对此问题变形,假设每个格子中有好多财宝,而每一次经过一个格子 ...

  9. BZOJ.1143.[CTSC2008]祭祀(Dilworth定理 最大流ISAP)

    题目链接 题目是求最长反链,反链指点集内任意两点不能互相到达. 根据Dilworth定理,在DAG中,\[最长反链 = 最小路径覆盖 = V - 最大匹配数\] 用Floyd求一遍传递闭包后,在所有可 ...

  10. bzoj 3997 Dilworth定理

    看到这道题感觉像是网络流,如果没有权值,可以用DAG最小路径覆盖,有权值,感觉可以求一个上下界最小可行流,但内存卡了....时间估计也悬. 正解要用到一些数学知识,这里梳理一下: 定义: 偏序关系: ...

随机推荐

  1. 【转】SVN使用教程总结

    看到一篇超赞的文章,原链接:http://www.cnblogs.com/armyfai/p/3985660.html SVN简介: 为什么要使用SVN? 程序员在编写程序的过程中,每个程序员都会生成 ...

  2. 正则表达式 获取字符串内提取图片URL字符串

    #region 获取字符串内提取图片URL字符串 /// <summary> /// 获取字符串内提取图片URL字符串 /// </summary> /// <param ...

  3. shell的符号总结

    1.命令替换符:先执行符号内的命令 反引号``:旧格式 $():新格式 2.字符串界定符: 单引号:保持引号内 的字符的字面值. 双引号:有些情况特殊. $echo '`date`' #不会执行`da ...

  4. 20145240 《Java程序设计》第四次实验报告

    20145240 <Java程序设计>第四次实验报告 北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1452 指导教师:娄嘉鹏 实验日期:2016.04.26 实验 ...

  5. 2018.7.12训练赛 -G

    第二道水题 前边说了很多话,但就最后两段有用. 就是给你一个序列,然后你判断一下这个序列是不是递增的,是就输出yes,否则输出no. 所以以后不管题目看起来多长.多复杂,都要读一遍. 代码就不贴了.

  6. 【iOS和HTML 5交互】iOS中加载html5调用html方法和修改html5内容

    近期项目开发中用到了这方面的技术了,那我们一起来看看. 1.利用webView控件加载本地html5或者网络上html5 2.设置控制器为webView的代理,遵守协议 3.实现代理方法webView ...

  7. 高通Android display分析【转】

    本文转载自:http://blog.csdn.net/zhangchiytu/article/details/6777039 高通7系列硬件架构分析 如上图,高通7系列 Display的硬件部分主要由 ...

  8. Go 字符串相关-标准库

    标准库中有四个包对字符串处理尤为重要: bytes strings strconv unicode strings包提供了许多如字符串的查询.替换.比较.截断.拆分和合并等功能. bytes包也提供了 ...

  9. Eclipse Task的使用

    参考链接:http://blog.csdn.net/limb99/article/details/8881891; http://hi.baidu.com/jinxv1987/item/64496f6 ...

  10. Linux 配置 SSL 证书

    完整的 SSL 证书分为四个部分: CA 根证书 (root CA) 中级证书 (Intermediate Certificate) 域名证书 证书密钥 (仅由您持有) 以 COMODO Positi ...