bzoj1143[CTSC2008]祭祀river
bzoj1143[CTSC2008]祭祀river
题意:
Y族居住地水系是一个由岔口和河道组成的网络。每条河道连接着两个岔口,并且水在河道内按照一个固定的方向流动。水系中不会有环流。由于人数众多的原因,Y族的祭祀活动会在多个岔口上同时举行。Y族人认为,如果水流可以从一个祭祀点流到另外一个祭祀点,那么祭祀就会失去它神圣的意义。求保持祭祀神圣性的基础上祭祀的地点数目的最大值。
题解:
利用各种性质。首先,题目的模型被称为最长反链,即在有向无环图中求一个点集使其两两不可达。Dilworth定理:最长反链长度=最小链覆盖(用最少的链覆盖所有节点)(证明:http://vfleaking.blog.163.com/blog/static/1748076342012918105514527/%vfk大神然而我看不懂)。求最小链覆盖的方法:建一个二分图,如果点a、b可达,则将左边的a与右边的边相连,求最大独立集。然后又有最大独立集=点数n(指二分图的半边的点数)-二分图最大匹配。
代码:
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <queue> 5 #define INF 0x3fffffff 6 #define inc(i,j,k) for(int i=j;i<=k;i++) 7 using namespace std; 8 9 int n,m,a[200][200],s,t; 10 struct e{int t,c,n;}; e es[100000]; int ess,g[1000]; 11 inline void pe(int f,int t,int c){ 12 es[++ess]=(e){t,c,g[f]};g[f]=ess;es[++ess]=(e){f,0,g[t]};g[t]=ess; 13 } 14 void init(){ess=-1; memset(g,-1,sizeof(g));} 15 queue <int> q; int h[1000]; 16 bool bfs(int s,int t){ 17 while(! q.empty())q.pop(); memset(h,-1,sizeof(h)); h[s]=0; q.push(s); 18 while(! q.empty()){ 19 int x=q.front(); q.pop(); 20 for(int i=g[x];i!=-1;i=es[i].n)if(es[i].c&&h[es[i].t]==-1)h[es[i].t]=h[x]+1,q.push(es[i].t); 21 } 22 if(h[t]==-1)return 0;else return 1; 23 } 24 int dfs(int x,int t,int f){ 25 if(x==t)return f; int used=0; 26 for(int i=g[x];i!=-1;i=es[i].n)if(es[i].c&&h[es[i].t]==h[x]+1){ 27 int w=dfs(es[i].t,t,min(f,es[i].c)); 28 es[i].c-=w; es[i^1].c+=w; used+=w; f-=w; if(f==0)return used; 29 } 30 if(used==0)h[x]=-1; return used; 31 } 32 int dinic(int s,int t){int ans=0; while(bfs(s,t))ans+=dfs(s,t,INF); return ans;}; 33 int main(){ 34 scanf("%d%d",&n,&m); memset(a,0,sizeof(a)); 35 inc(i,1,m){int a1,b1; scanf("%d%d",&a1,&b1); a[a1][b1]=1;} 36 inc(k,1,n)inc(i,1,n)inc(j,1,n)a[i][j]|=a[i][k]&a[k][j]; 37 s=0; t=n+n+1; init(); 38 inc(i,1,n)pe(s,i,1),pe(i+n,t,1); 39 inc(i,1,n)inc(j,1,n)if(a[i][j])pe(i,j+n,1); 40 printf("%d",n-dinic(s,t)); 41 }
20160701
转载于:https://www.cnblogs.com/YuanZiming/p/5693035.html
bzoj1143[CTSC2008]祭祀river相关推荐
- BZOJ1143: [CTSC2008]祭祀river 网络流_Floyd_最大独立集
Description 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都 会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组 ...
- [bzoj1143][CTSC2008]祭祀river——DAG上最长反链,Dilworth定理,最大二分图匹配,Floyd
题目大意: 给定一个DAG图,求最长反链(即一个点集,其中任意点两两不可以相互到达). 思路: 一开始我其实是想用求最大独立集的方法去求的.但是并不会(好像也过不去). 题目所要求的是最长反链,需要用 ...
- BZOJ1143[CTSC2008]祭祀river 偏序集及Dilworth定理
这里讲一下我对偏序集的认识 如果有偏差可以评论我 我会修改 一:定义 (度娘上copy来的 不想看的可以跳过 设R是非空集合A上的一个二元关系,若R满足: 自反性.反对称性.传递性,则称R为A ...
- bzoj1143/2718 祭祀river(最大独立集)
[CTSC2008]祭祀river Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2175 Solved: 1098 [Submit][Statu ...
- 最长反链(bzoj 1143: [CTSC2008]祭祀river)
题目描述: 给你一个n个点m条边的有向无环图,求出最大点集满足其中任意两点间都不能存在路径 也就是对于所有的x, y∈S,x不能到达y,y也不能到达x 对于有向无环图(DAG): 链:一些点的集合,链 ...
- 【bzoj1143】[CTSC2008]祭祀river Floyd+网络流最小割
在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都 会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组成的网络.每条河道连接着 ...
- [CTSC2008]祭祀river
Description 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典,Y族都会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组成的 ...
- 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 ...
最新文章
- CVPR 2021:记一次神奇的 Rebuttal 经历
- 【原】十张javascript思维导图
- PHP封装对象名字的思路
- 【springboot】spring-boot-devtools 热部署 导致 mvn spring-boot:run 出现异常
- java 静态方法同步_Java – 同步静态方法
- [转载]常用内部排序算法--用VB6实现
- 使用layui 做后台管理界面,在Tab中的链接点击后添加一个新TAB的解决方法
- SpringBoot Logback配置,SpringBoot日志配置
- mount、umount 挂载卸载命令
- for linux shell 菜鸟_Linux 命令大全 | 菜鸟教程
- 我在知乎上关于Laser200/310电脑的文章。
- 钢铁侠java_现代版“钢铁侠”,无所不能的程序员,java工程师实现人造器官!...
- Elasticsearch生命周期ILM若干时间后自动删除索引index
- 【转载】如何从win8/8.1中文版(核心版)升级到win8/8.1专业版
- GPS坐标显示在百度地图上(Qt+百度地图)
- 记一次iphone更换电池难以取下旧电池解决办法
- 经济筑底要看房市“脸色”
- python将数字转换为中文_Python:将数字转换为文字
- 为此计算机所有用户安装此项,windows已经阻止此软件因为无法验证发行者,教您提示win已阻止此软件因为无法验...
- 瞪羚企业申报流程材料