题目描述

  在遥远的东方,有一个神秘的民族,自称Y族。他们世代居住在水面上,奉龙王为神。每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动。我们可以把Y族居住地水系看成一个由岔口和河道组成的网络。每条河道连接着两个岔口,并且水在河道内按照一个固定的方向流动。显然,水系中不会有环流,由于人数众多的原因,Y族的祭祀活动会在多个岔口上同时举行。出于对龙王的尊重,这些祭祀地点的选择必须非常慎重。准确地说,Y族人认为,如果水流可以从一个祭祀点流到另外一个祭祀点,那么祭祀就会失去它神圣的意义。族长希望在保持祭祀神圣性的基础上,选择尽可能多的祭祀的地点。

输入输出格式

输入格式:

第一行包含两个用空格隔开的整数N、M,分别表示岔口和河道的数目,岔口从1到N编号。

接下来M行,每行包含两个用空格隔开的整数u、v,描述一条连接岔口u和岔口v的河道,水流方向为自u向v。

输出格式:

 第一行包含一个整数K,表示最多能选取的祭祀点的个数。 接下来一行输出一种可行的选取方案。对于每个岔口依次输出一个整数,如果在该岔口设置了祭祀点,那么输出一个1,否则输出一个0。应确保你输出的1 的个数最多,且中间没有空格。 接下来一行输出,在选择最多祭祀点的前提下,每个岔口是否能够设置祭祀点。对于每个岔口依次输出一个整数,如果在该岔口能够设置祭祀点,那么输出一个 1,否则输出一个0。 注意:多余的空格和换行可能会导致你的答案被判断为错误答案。

输入输出样例

输入样例#1:

4 4
1 2
3 4
3 2
4 2

输出样例#1:

2
1010
1011

说明

N ≤ 100 M ≤ 1 000

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

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

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


题解

这似乎算是一道结论题?

首先这道题就是让我们求一条最长的反链

反链就是一个点的集合,在这个集合中任意两点不互相到达

那么有一个定理

最长反链 = 最小链覆盖

然后最小链覆盖就是最小路径覆盖

那么我们这题就先传递闭包一波然后当成最小路径覆盖做就好了

最小路径覆盖

就是把每个点拆成两个点跑最大流

因为每次增广就相当于把两条路径给合并起来

所以最大流的增广次数就是路径的合并次数

答案就是点数-最大流

代码

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
const int M = 210 ;
const int INF = 1e9 ;
using namespace std ;
inline int read() {char c = getchar() ; int x = 0 , w = 1 ;while(c>'9'||c<'0') { if(c=='-') w = -1 ; c = getchar() ; }while(c>='0'&&c<='9') { x = x*10+c-'0' ; c = getchar() ; }return x*w ;
}bool f[M][M] , sit[M] ;
int n , m , num = 1 , hea[M] ;
int S , T , Ans , d[M] ;
struct E {int Nxt , to , dis ;
} edge[M * M << 1] ;
inline void add_edge(int from , int to , int dis) {edge[++num].Nxt = hea[from] ;  edge[num].to = to ;edge[num].dis = dis ; hea[from] = num ;
}
inline void Insert(int u , int v , int w) {add_edge(u , v , w) ;add_edge(v , u , 0) ;
}
inline bool Bfs() {queue < int > q ; q.push(S) ;memset(d , 0 , sizeof(d)) ; d[S] = 1 ;while(!q.empty()) {int u = q.front() ; q.pop() ;for(int i = hea[u] ; i ; i = edge[i].Nxt) {int v = edge[i].to ;if(!d[v] && edge[i].dis) {d[v] = d[u] + 1 ;q.push(v) ;}}}return d[T] ;
}
int Dfs(int u , int dis) {if(u == T || !dis) return dis ;int sum = 0 ;for(int i = hea[u] ; i ; i = edge[i].Nxt) {int v = edge[i].to ;if(d[v] == d[u] + 1 && edge[i].dis) {int diss = Dfs(v , min(dis , edge[i].dis)) ;if(diss > 0) {edge[i].dis -= diss ; edge[i ^ 1].dis += diss ;sum += diss ; dis -= diss ;if(!dis) break ;}}}if(!sum) d[u] = -1 ;return sum ;
}
inline int Dinic() {Ans = 0 ;while(Bfs())Ans += Dfs(S , INF) ;return Ans ;
}
inline void Rebuild(int u) {for(int i = 1 ; i <= n ; i ++) {if(i == u) continue ;Insert(S , i , 1) ;Insert(n + i , T , 1) ;}for(int i = 1 ; i <= n ; i ++) {if(i == u) continue ;for(int j = 1 ; j <= n ; j ++){if(!f[i][j] || j == u || i == j) continue ;Insert(i , n + j , 1) ;}}
}
int main() {n = read() ; m = read() ; S = 0 , T = n * 2 + 5 ; for(int i = 1 ; i <= n ; i ++) f[i][i] = true ;for(int i = 1 , u , v ; i <= m ; i ++) {u = read() , v = read() ;f[u][v] = true ;}for(int k = 1 ; k <= n ; k ++)for(int i = 1 ; i <= n ; i ++)for(int j = 1 ; j <= n ; j ++)f[i][j] |= (f[i][k] & f[k][j]) ;for(int i = 1 ; i <= n ; i ++) {Insert(S , i , 1) ;Insert(n + i , T , 1) ;}for(int i = 1 ; i <= n ; i ++)for(int j = 1 ; j <= n ; j ++)if(f[i][j] && i != j)Insert(i , n + j , 1) ;int tmp = n - Dinic() ;printf("%d\n",tmp) ;return 0 ;
}

转载于:https://www.cnblogs.com/beretty/p/10105914.html

[CTSC2008]祭祀相关推荐

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

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

  2. bzoj1143[CTSC2008]祭祀river

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

  3. [CTSC2008]祭祀river

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

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

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

  5. bzoj 1143: [CTSC2008]祭祀river

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

  6. 1143: [CTSC2008]祭祀river

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

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

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

  8. BZOJ-1143 [CTSC2008]祭祀

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

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

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

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

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

最新文章

  1. Facebook开源ptr:在Python环境中并行运行单元测试
  2. python编辑器_10 个可以在平板电脑上使用的 Python 编辑器
  3. jvm内存参数配置_“步步精心”-常用JVM配置参数
  4. 7 行代码优雅地实现 Excel 文件导出功能?
  5. python爬取商城数据_Python爬取新版CRMEB小程序商城后台订单数据,保存为excel
  6. 未与信任 SQL Server 连接相关联
  7. 2.1_stack_栈
  8. lambda表达式的语法精简
  9. nvme驱动架构分析1
  10. 无锁编程的原理和应用
  11. 测试用例(分析法——详细场景法)
  12. 首日回顾:新一代区块链开发平台初步建成 | ArcBlock Devcon 2020
  13. (附源码)Python音乐分类系统 毕业设计 250858
  14. C++五子棋源码(Qt版)
  15. php file_put_contents 根目录权限,关于php:file_put_contents权限被拒绝
  16. Http Header里的Content-Type
  17. 1026 Table Tennis (30分)
  18. 显示器接服务器后黑屏,笔记本外接显示器黑屏怎么修复_笔记本外接显示器后黑屏的处理方法...
  19. ADT OO OB 的区别
  20. 十六、Vert.x、Actix-web、Warp、Axum 性能对比

热门文章

  1. Begin using git (Part1) - Git的安装与配置
  2. .NET伪静态使用以及和纯静态的区别
  3. HTML标签margin和padding的默认属性值
  4. 增强for中操作集合元素的误区---java.util.ConcurrentModificationException
  5. 文件大小图形化软件 SpaceSniffer(转载)
  6. SpringBoot与SpringCloud版本对应信息
  7. 指令 出厂_CNC数控加工中心编程指令详解
  8. python 部署模型,关于python:机器学习模型python在线服务部署的两种实例
  9. mybatis配置指定的数据库连接池、mybatis配置多个数据源
  10. 帝豪gs车机系统wince_平顶山到河南,帝豪GS俱乐总部,帝豪GS两年用车感受