【bzoj1143】[CTSC2008]祭祀river Floyd+网络流最小割
题目描述
输入
输出
第一行包含一个整数K,表示最多能选取的祭祀点的个数。
样例输入
4 4
1 2
3 4
3 2
4 2
样例输出
2
题解
Floyd+拆点+网络流最小割
看了网上那些高端的做法,不明觉厉。
最多能保留几个点,即最少需要去掉几个点,即最小割。
先用Floyd求出两个点是否能同时选择(即不连通),然后建图,如果两个不同的点i和j不能同时选择,则加i->j'的边,容量为inf。
再加源点s->i的边,容量为1,加i'->汇点t的边,容量为1。
然后跑dinic即可,答案为n-maxflow。
UPD:这个应该叫Dilworth定理吧,DAG最小链覆盖等于最长反链,本题要求最长反链可以转化为最小链覆盖来求,最小链覆盖求法见上。
#include <cstdio>
#include <cstring>
#include <queue>
#define inf 0x7fffffff
using namespace std;
queue<int> q;
int map[110][110] , head[210] , to[12000] , val[12000] , next[12000] , cnt = 1 , dis[210] , s , t;
void add(int x , int y , int z)
{
to[++cnt] = y;
val[cnt] = z;
next[cnt] = head[x];
head[x] = cnt;
}
bool bfs()
{
int x , i;
while(!q.empty()) q.pop();
memset(dis , 0 , sizeof(dis));
dis[s] = 1;
q.push(s);
while(!q.empty())
{
x = q.front();
q.pop();
for(i = head[x] ; i ; i = next[i])
{
if(val[i] && !dis[to[i]])
{
dis[to[i]] = dis[x] + 1;
if(to[i] == t) return 1;
q.push(to[i]);
}
}
}
return 0;
}
int dinic(int x , int low)
{
if(x == t) return low;
int temp = low , i , k;
for(i = head[x] ; i ; i = next[i])
{
if(val[i] && dis[to[i]] == dis[x] + 1)
{
k = dinic(to[i] , min(temp , val[i]));
if(!k) dis[to[i]] = 0;
val[i] -= k , val[i ^ 1] += k;
if(!(temp -= k)) break;
}
}
return low - temp;
}
int main()
{
int n , m , i , j , k , x , y , ans = 0;
scanf("%d%d" , &n , &m);
s = 0 , t = 2 * n + 1;
for(i = 1 ; i <= m ; i ++ )
scanf("%d%d" , &x , &y) , map[x][y] = 1;
for(k = 1 ; k <= n ; k ++ )
for(i = 1 ; i <= n ; i ++ )
for(j = 1 ; j <= n ; j ++ )
map[i][j] |= map[i][k] & map[k][j];
for(i = 1 ; i <= n ; i ++ )
add(s , i , 1) , add(i , s , 0) , add(i + n , t , 1) , add(t , i + n , 0);
for(i = 1 ; i <= n ; i ++ )
for(j = 1 ; j <= n ; j ++ )
if(i != j && map[i][j])
add(i , j + n , inf) , add(j + n , i , 0);
while(bfs())
ans += dinic(s , inf);
printf("%d\n" , n - ans);
return 0;
}
【bzoj1143】[CTSC2008]祭祀river Floyd+网络流最小割的更多相关文章
- BZOJ1143 [CTSC2008]祭祀river 【二分图匹配】
1143: [CTSC2008]祭祀river Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3236 Solved: 1651 [Submit] ...
- 【Floyd】【Dilworth定理】【最小路径覆盖】【匈牙利算法】bzoj1143 [CTSC2008]祭祀river
Dilworth定理,将最长反链转化为最小链覆盖.//貌似还能把最长上升子序列转化为不上升子序列的个数? floyd传递闭包,将可以重叠的最小链覆盖转化成不可重叠的最小路径覆盖.(引用:这样其实就是相 ...
- BZOJ1143: [CTSC2008]祭祀river 网络流_Floyd_最大独立集
Description 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都 会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组 ...
- BZOJ1143 [CTSC2008]祭祀river 二分图匹配 最小链覆盖
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1143 题意概括 给出一个有向图.求最小链覆盖. 题解 首先说两个概念: 链:一条链是一些点的集合, ...
- BZOJ1143 [CTSC2008] 祭祀river
AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=1143 题目大意: 给你n个点,点与点之间由有向边相连.如果u能到达v的话,那么他们就不能同 ...
- bzoj1143: [CTSC2008]祭祀river 最长反链
题意:在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组成的网络.每条河道连 ...
- [BZOJ1143][CTSC2008]祭祀river(Dilworth定理+二分图匹配)
题意:给你一张n个点的DAG,最大化选择的点数,是点之间两两不可达. 要从Dilworth定理说起. Dilworth定理是定义在偏序集上的,也可以从图论的角度解释.偏序集中两个元素能比较大小,则在图 ...
- [BZOJ1143][CTSC2008]祭祀river(最长反链)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1143 分析: 最长反链==最小路径覆盖==n-二分图最大匹配数 某神犇对二分图的总结: ...
- bzoj1143: [CTSC2008]祭祀river && bzoj27182718: [Violet 4]毕业旅行
其实我至今不懂为啥强联通缩点判入度会错... 然后这个求的和之前那道组合数学一样,就是最长反链=最小链覆盖=最大独立集. #include<cstdio> #include<iost ...
随机推荐
- Oracle,SQL Server 数据库较MySql数据库,Sql语句差异
原文:Oracle,SQL Server 数据库较MySql数据库,Sql语句差异 Oracle,SQL Server 数据库较MySql数据库,Sql语句差异 1.关系型数据库 百度百科 关系数据库 ...
- AIX7.1删除大批量文件(百万级、千万级)
假设/data/test目录下含有数百万上千万的文件需要删除,可以选择的方式如下: 1.如果文件名不包含空白符.引号等特殊字符,则可以使用如下命令: find /data/test -type f | ...
- 如何用istio实现应用的灰度发布
Istio为用户提供基于微服务的流量治理能力.Istio允许用户按照标准制定一套流量分发规则,并且无侵入的下发到实例中,平滑稳定的实现灰度发布功能. 基于华为云的Istio服务网格技术,使得灰度发布全 ...
- hdu2509Be the Winner(反nim博弈)
Be the Winner Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- windows环境下jmeter生成测试报告
1.要求 jmeter需要在3.0版本以上 jdk1.7以上 需要准备脚本文件,即jmx文件 2.进入cmd界面 3.进入jmeter的bin目录 cd:\xxxx\apache-jmeter-4.0 ...
- 初学Direct X(8) ——碰撞检测
初学Direct X(8) --碰撞检测 真正让一个游戏鹤立鸡群的是程序对碰撞的响应有多好,这里介绍两种检测的方法: 1) 基于边框的碰撞检测 2) 基于距离的碰撞检测 1. 基于边框的碰撞检测 1. ...
- SpriteKit手机游戏摇杆JoyStick的使用 -- by iFIERO游戏开发教程
### 工欲善其事,必先利其器 有时候学习如何应用第三方库是非常重要的,因为我们不用再自己重复造轮子,在这里,我们就把原先利用重力感应来操控飞机改为用游戏摇杆joystick来操控,具体的操作如下:` ...
- HADOOP-输出数据实体类承载
新建一个bean包: 1.实现Writerable 2.有一个空的构造方法 代码实现: import java.io.DataInput; import java.io.DataOutput; imp ...
- C指针函数中的局部变量返回
所谓指针函数其实就是 :一个函数的返回值为指针. 指针函数定义:返回类型标识符* 函数名(形参列表){函数体} eg: int* fun1(int n){} 指针函数和局部变量返回解析: 简 ...
- 洛谷 P1706 全排列问题 :STL / dfs
题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入输出格式 输入格式: n(1≤n≤9) 输出格式: 由1-n组成的所有不重复的数字序列, ...