BZOJ-1143 [CTSC2008]祭祀
Description
在遥远的东方,有一个神秘的民族,自称Y族。他们世代居住在水面上,奉龙王为神。每逢重大庆典, Y族都
会在水面上举办盛大的祭祀活动。我们可以把Y族居住地水系看成一个由岔口和河道组成的网络。每条河道连接着
两个岔口,并且水在河道内按照一个固定的方向流动。显然,水系中不会有环流(下图描述一个环流的例子)。
由于人数众多的原因,Y族的祭祀活动会在多个岔口上同时举行。出于对龙王的尊重,这些祭祀地点的选择必
须非常慎重。准确地说,Y族人认为,如果水流可以从一个祭祀点流到另外一个祭祀点,那么祭祀就会失去它神圣
的意义。族长希望在保持祭祀神圣性的基础上,选择尽可能多的祭祀的地点。
Input
第一行包含两个用空格隔开的整数N、M,分别表示岔口和河道的数目,岔口从1到N编号。
接下来M行,每行包含两个用空格隔开的整数u、v,
描述一条连接岔口u和岔口v的河道,水流方向为自u向v。
N≤100M≤1000
Output
第一行包含一个整数K,表示最多能选取的祭祀点的个数。
Sample Input
4 4
1 2
3 4
3 2
4 2
Sample Output
2
很明显的找一条最长反链。
然后最长反链=最小链覆盖。注意是最小链覆盖而不是最小路径覆盖。
所以我们先跑一次传递闭包即可。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int inf=0x3f3f3f3f;
const int N=210,M=1e6+10;
int n,m,s,t,h[N],g[N][N];
int head[N],nex[M],to[M],w[M],tot=1;
inline void ade(int a,int b,int c){to[++tot]=b; nex[tot]=head[a]; w[tot]=c; head[a]=tot;
}
inline void add(int a,int b,int c){ade(a,b,c); ade(b,a,0);}
inline int bfs(){queue<int> q; q.push(s); memset(h,0,sizeof h); h[s]=1;while(q.size()){int u=q.front(); q.pop();for(int i=head[u];i;i=nex[i]){if(w[i]&&!h[to[i]]){h[to[i]]=h[u]+1; q.push(to[i]);}}}return h[t];
}
int dfs(int x,int f){if(x==t) return f; int fl=0;for(int i=head[x];i&&f;i=nex[i]){if(w[i]&&h[to[i]]==h[x]+1){int mi=dfs(to[i],min(f,w[i]));w[i]-=mi,w[i^1]+=mi,fl+=mi,f-=mi;}}if(!fl) h[x]=-1;return fl;
}
inline int dinic(){int res=0;while(bfs()) res+=dfs(s,inf);return res;
}
void floyd(){for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)g[i][j]|=(g[i][k]&g[k][j]);
}
signed main(){cin>>n>>m; t=n*2+1;for(int i=1,a,b;i<=m;i++) cin>>a>>b,g[a][b]=1;for(int i=1;i<=n;i++) add(s,i,1),add(i+n,t,1);floyd();for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(g[i][j]!=0) add(i,j+n,1);cout<<n-dinic();return 0;
}
BZOJ-1143 [CTSC2008]祭祀相关推荐
- 最长反链(bzoj 1143: [CTSC2008]祭祀river)
题目描述: 给你一个n个点m条边的有向无环图,求出最大点集满足其中任意两点间都不能存在路径 也就是对于所有的x, y∈S,x不能到达y,y也不能到达x 对于有向无环图(DAG): 链:一些点的集合,链 ...
- bzoj 1143: [CTSC2008]祭祀river
Description 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都 会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组 ...
- BZOJ.1143.[CTSC2008]祭祀(Dilworth定理 最大流ISAP)
题目链接 题目是求最长反链,反链指点集内任意两点不能互相到达. 根据Dilworth定理,在DAG中,\[最长反链 = 最小路径覆盖 = V - 最大匹配数\] 用Floyd求一遍传递闭包后,在所有可 ...
- 1143: [CTSC2008]祭祀river
Time Limit: 10 Sec Memory Limit: 162 MB Submit: 4018 Solved: 2048 [Submit][Status][Discuss] Descri ...
- bzoj1143[CTSC2008]祭祀river
bzoj1143[CTSC2008]祭祀river 题意: Y族居住地水系是一个由岔口和河道组成的网络.每条河道连接着两个岔口,并且水在河道内按照一个固定的方向流动.水系中不会有环流.由于人数众多的原 ...
- bzoj 1143 bzoj 2718 最长反链
题意:n个点,m条有向边,求最长反链 又到了涨姿势的时候了...(果然蒟蒻) DAG中,有如下的一些定义和性质: 链:一条链是一些点的集合,链上任意两个点x, y,满足要么 x 能到达 y ,要么 y ...
- BZOJ1143[CTSC2008]祭祀river 偏序集及Dilworth定理
这里讲一下我对偏序集的认识 如果有偏差可以评论我 我会修改 一:定义 (度娘上copy来的 不想看的可以跳过 设R是非空集合A上的一个二元关系,若R满足: 自反性.反对称性.传递性,则称R为A ...
- BZOJ 1143 祭祀
Description 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组成 ...
- BZOJ 1143 祭祀 river(最大独立集)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1143 题意:给出一个有向无环图.在其中找出一个最大的点集使得点集中任意两个点之间不可达. ...
- BZOJ 1143 祭祀river 最长反链
http://vfleaking.blog.163.com/blog/static/1748076342012918105514527/大前提:在有向无环图中链是一个点的集合,这个集合中任意两个元素v ...
最新文章
- 一个用微软官方的OpenXml读写Excel 目前网上不太普及的方法。
- 九宫格抽奖转盘源码分析
- http反向代理调度算法追朔
- java表驱动法索引访问_表驱动法 - SegmentFault 思否
- linux 云主机 卡顿 排查过程
- 蓝桥杯-数字三角形 (java)
- APACHE服务器出现No input file specified.的完美解决方案
- 天涯共此式 有AI月更圆
- js学习日记-new Object和Object.create到底干了啥
- 未来的电视是什么样子?
- 数据结构与算法深入学习_我最喜欢的免费课程,用于深入学习数据结构和算法...
- RSA私钥文件(PEM-PKCS#1)解析
- java调python报错Cannot create PyString with non-byte value
- mysql数据库备份和还原的命令_Mysql数据库备份和还原常用的命令
- 数值分析(2)-误差
- MySQL数据库锁机制
- Flutter String 常用方法
- linux 下动手实现bash -lR 命令
- 嵌入式主板有哪些特点?
- 图像处理随笔之峰值信噪比(peak signal to noise ratio)