原题链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1143

祭祀river

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

HINT
【样例说明】

在样例给出的水系中,不存在一种方法能够选择三个或者三个以上的祭祀点。包含两个祭祀点的测试点的方案有两种:

选择岔口1与岔口3(如样例输出第二行),选择岔口1与岔口4。

水流可以从任意岔口流至岔口2。如果在岔口2建立祭祀点,那么任意其他岔口都不能建立祭祀点。

但是在最优的一种祭祀点的选取方案中我们可以建立两个祭祀点,所以岔口2不能建立祭祀点。对于其他岔口至少存在一个最优方案选择该岔口为祭祀点,所以输出为1011。

题解

这道题求的是最长反链,在DAGDAG\mathcal{DAG}中与最小链覆盖等价。

但我们不能直接求出最小链覆盖,所以先用一个FloydFloyd\mathcal{Floyd}传递闭包将能到达的点直接连在一起,新建的图上的最小路径覆盖等于原图的最小链覆盖。

怎么求最小路径覆盖呢???

我们将每个点拆成两份,如果可达则连边,样例建出来的图如下,图中边权都为111:

建图可以这么理解:初始每个点位单独的链,每流过一单位流量就相当于把一条链接到另一条链上,链的数目−1" role="presentation" style="position: relative;">−1−1-1,所以最终答案为n−maxflown−maxflown-maxflow。

代码
#include<bits/stdc++.h>
using namespace std;
const int M=10005,inf=0x3f3f3f3f;
struct sd{int to,fl;}ed[M];
bool sq[M][M];
int s,t,n,m,id,d[M];
vector<int>mmp[M];
queue<int>dui;
void add(int f,int t,int w){mmp[f].push_back(id);ed[id++]=(sd){t,w};mmp[t].push_back(id);ed[id++]=(sd){f,0};}
bool bfs()
{memset(d,0,sizeof(d));d[s]=1;dui.push(s);int hh,to,fl,f;while(!dui.empty()){f=dui.front();dui.pop();for(int i=mmp[f].size()-1;i>=0;--i){hh=mmp[f][i],to=ed[hh].to,fl=ed[hh].fl;if(d[to]||!fl)continue;d[to]=d[f]+1;dui.push(to);}}return d[t];
}
int dfs(int v,int e,int minn)
{if(v==e||!minn)return minn;int ans=0,tmp,hh,fl,to;for(int i=mmp[v].size()-1;i>=0;--i){hh=mmp[v][i],to=ed[hh].to,fl=ed[hh].fl;if(d[to]!=d[v]+1||!fl)continue;tmp=dfs(to,e,min(fl,minn-ans));if(!tmp)continue;ed[hh].fl-=tmp,ed[hh^1].fl+=tmp;ans+=tmp;}return ans;
}
void in(){int a,b;scanf("%d%d",&n,&m);for(int i=1;i<=m;++i)scanf("%d%d",&a,&b),sq[a][b]=1;}
void ac()
{t=(n<<1)+1;int ans=0;for(int j=1;j<=n;++j)for(int i=1;i<=n;++i)for(int k=1;k<=n;++k)if(sq[i][j]&&sq[j][k])sq[i][k]=1;for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)if(i!=j&&sq[i][j])add(i,j+n,1);for(int i=1;i<=n;++i)add(s,i,1),add(i+n,t,1);while(bfs())ans+=dfs(s,t,inf);printf("%d",n-ans);
}
int main(){in();ac();}

BZOJ1143[CTSC2008] 祭祀river相关推荐

  1. bzoj1143[CTSC2008]祭祀river

    bzoj1143[CTSC2008]祭祀river 题意: Y族居住地水系是一个由岔口和河道组成的网络.每条河道连接着两个岔口,并且水在河道内按照一个固定的方向流动.水系中不会有环流.由于人数众多的原 ...

  2. BZOJ1143: [CTSC2008]祭祀river 网络流_Floyd_最大独立集

    Description 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都 会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组 ...

  3. [bzoj1143][CTSC2008]祭祀river——DAG上最长反链,Dilworth定理,最大二分图匹配,Floyd

    题目大意: 给定一个DAG图,求最长反链(即一个点集,其中任意点两两不可以相互到达). 思路: 一开始我其实是想用求最大独立集的方法去求的.但是并不会(好像也过不去). 题目所要求的是最长反链,需要用 ...

  4. BZOJ1143[CTSC2008]祭祀river 偏序集及Dilworth定理

    这里讲一下我对偏序集的认识   如果有偏差可以评论我  我会修改 一:定义 (度娘上copy来的  不想看的可以跳过 设R是非空集合A上的一个二元关系,若R满足: 自反性.反对称性.传递性,则称R为A ...

  5. bzoj1143/2718 祭祀river(最大独立集)

    [CTSC2008]祭祀river Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2175  Solved: 1098 [Submit][Statu ...

  6. 最长反链(bzoj 1143: [CTSC2008]祭祀river)

    题目描述: 给你一个n个点m条边的有向无环图,求出最大点集满足其中任意两点间都不能存在路径 也就是对于所有的x, y∈S,x不能到达y,y也不能到达x 对于有向无环图(DAG): 链:一些点的集合,链 ...

  7. 【bzoj1143】[CTSC2008]祭祀river Floyd+网络流最小割

    在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都 会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组成的网络.每条河道连接着 ...

  8. [CTSC2008]祭祀river

    Description 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典,Y族都会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组成的 ...

  9. bzoj 1143: [CTSC2008]祭祀river

    Description 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都 会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组 ...

  10. 1143: [CTSC2008]祭祀river

    Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4018  Solved: 2048 [Submit][Status][Discuss] Descri ...

最新文章

  1. 驾校计算机岗位管理制度,驾校计算机的规章制度.doc
  2. 卢卡斯定理及其卢卡斯定理的拓展
  3. Android实现网络音乐播放器
  4. tp mysql 去重
  5. java 数组排序_用Java对数组排序
  6. apache 反向代理_反向代理?听起来有点东西 ——Nginx学习笔记
  7. Hibernate-注解-实体类
  8. 腾讯回应“QQ 冻结”;高德上线“家人地图”惹争议;Linux 内核讨论引入 Rust 代码 | 极客头条
  9. 关于do{}while()的代码讨论
  10. Linux篇---Grep和正则匹配
  11. 计算机病毒通常是指一段指令或什么,计算机病毒通常是()。 - 问答库
  12. 网站没有外链 如何计算权重
  13. word2019 分页、分节(即分节符下的分页)、页码、页眉设置最佳实践
  14. oracle数据库alter table,oracle 数据库 alter table的用法(经典)
  15. 2003系统服务器不设置密码,服务器2003怎么设置密码
  16. 二十九岁,刚读完了财富启蒙读物《小狗钱钱》
  17. ChatGPT一战封神,和它聊完后,我更想躺平了
  18. 基于AIC评价指标的逐步回归Python语言实现
  19. 峰值检测电路和精密整流电路
  20. 怎么用PS做出划痕的效果?

热门文章

  1. 第六章 静电场中的导体和电介质
  2. 242.有效的字母异位词(力扣leetcode) 博主可答疑该问题
  3. rsync linux 教程,rsync 用法教程
  4. java对谷歌不兼容_谷歌浏览器不兼容的一些Js
  5. 第 7 章 Neutron - 067 - Neutron 架构
  6. 项目管理的前路怎么样?PMP证书作用如何?
  7. [UNIX]The UNIXHATERS Handbook
  8. 【Ubuntu】ubuntu 16.04 设置root用户初始密码
  9. XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Saratov
  10. jquery遍历json与数组方法总结