SCUT - 205 - 饲养牛 - 最大流
https://scut.online/p/205
连着做所以一开始就觉得是网络流。
这种至多分配几次的很有网络流的特征。
一开始想从食物和饮料流向牛,但是怎么搞都不对。
其实可以从s流向食物,食物流向牛,牛流向饮料,饮料流向t。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
namespace Dinic_Maxflow {
/* 备注:
1.检查MAXN与MAXM,注意预留反向边和额外边的位置
2.每次建图的第一次add_edge()前必须先init()
3.不传入第三参数的dinic(s,t)需保证t是最后的结点
*/
const int INF=0x3f3f3f3f;
const int MAXN=2000;
const int MAXM=200000;
//注意网络流要预留反向边
int tol;
int head[MAXN+5];
struct Edge {
int to,next,cap,flow;
} edge[MAXM+5];
void init() {
//.//用来触发编译错误
tol=2;
memset(head,-1,sizeof(head));
}
//为了方便使用二分图匹配,默认容量为1,默认反向容量为0
void add_edge(int u,int v,int w=1,int rw=0) {
edge[tol].to=v;
edge[tol].cap=w;
edge[tol].flow=0;
edge[tol].next=head[u];
head[u]=tol++;
edge[tol].to=u;
edge[tol].cap=rw;
edge[tol].flow=0;
edge[tol].next=head[v];
head[v]=tol++;
}
int Q[MAXN+5];
int dep[MAXN+5],cur[MAXN+5],sta[MAXN+5];
bool bfs(int s,int t) {
//front 与 back 的缩写
int fnt=0,bak=0;
memset(dep,-1,sizeof(dep[0])*(t+1));
dep[s]=0;
Q[bak++]=s;
while(fnt<bak) {
int u=Q[fnt++];
for(int i=head[u]; i!=-1; i=edge[i].next) {
int v=edge[i].to;
if(dep[v]==-1&&edge[i].cap>edge[i].flow) {
dep[v]=dep[u]+1;
if(v==t)
return true;
Q[bak++]=v;
}
}
}
return false;
}
int dinic(int s,int t) {
int maxflow=0;
while(bfs(s,t)) {
for(int i=0; i<=t; i++)
cur[i]=head[i];
int u=s,tail=0;
while(cur[s]!=-1) {
if(u==t) {
int tp=INF;
for(int i=tail-1; i>=0; i--) {
tp=min(tp,edge[sta[i]].cap-edge[sta[i]].flow);
}
maxflow+=tp;
for(int i=tail-1; i>=0; i--) {
edge[sta[i]].flow+=tp;
edge[sta[i]^1].flow-=tp;
if(edge[sta[i]].cap-edge[sta[i]].flow==0)
tail=i;
}
u=edge[sta[tail]^1].to;
} else if(cur[u]!=-1&&edge[cur[u]].cap>edge[cur[u]].flow
&&dep[u]+1==dep[edge[cur[u]].to]) {
sta[tail++]=cur[u];
u=edge[cur[u]].to;
} else {
while(u!=s&&cur[u]==-1) {
u=edge[sta[--tail]^1].to;
}
cur[u]=edge[cur[u]].next;
}
}
}
return maxflow;
}
/* 备注:
1.检查MAXN与MAXM,注意预留反向边和额外边的位置
2.每次建图的第一次addedge()前必须先init()
3.不传入第三参数的dinic(s,t)需保证t是最后的结点
*/
}
using namespace Dinic_Maxflow;
int n,f,d;
inline int id(char type,int x) {
int res=0;
switch(type) {
case 'n':
return x;
case 'f':
return n+x;
case 'd':
return n+f+x;
default:
exit(-1);
}
}
int main() {
#ifdef Yinku
freopen("Yinku.in","r",stdin);
#endif // Yinku
while(~scanf("%d%d%d",&n,&f,&d)) {
init();
int s=0,t=n+f+d+1;
for(int i=1;i<=f;i++){
add_edge(s,id('f',i),1);
}
for(int i=1;i<=d;i++){
add_edge(id('d',i),t,1);
}
for(int i=1; i<=n; i++) {
int fi,di;
scanf("%d%d",&fi,&di);
int u=id('n',i);
for(int j=1;j<=fi;j++){
int v;
scanf("%d",&v);
v=id('f',v);
add_edge(v,u,1);
}
for(int j=1;j<=di;j++){
int v;
scanf("%d",&v);
v=id('d',v);
add_edge(u,v,1);
}
}
printf("%d\n",dinic(s,t));
}
}
SCUT - 205 - 饲养牛 - 最大流的更多相关文章
- bzoj 1738 [Usaco2005 mar]Ombrophobic Bovines 发抖的牛 最大流+二分
题目要求所有牛都去避雨的最长时间最小. 显然需要二分 二分之后考虑如何判定. 显然每头牛都可以去某个地方 但是前提是最短路径<=mid. 依靠二分出来的东西建图.可以发现这是一个匹配问题 din ...
- poj 3281 Dining 拆点 最大流
题目链接 题意 有\(N\)头牛,\(F\)个食物和\(D\)个饮料.每头牛都有自己偏好的食物和饮料列表. 问该如何分配食物和饮料,使得尽量多的牛能够既获得自己喜欢的食物又获得自己喜欢的饮料. 建图 ...
- [No00002C]人的寿命应该能达到100至175岁-北大齐教授健康讲座笔录
人的寿命应该能达到100 至175 岁,为什么都没有达到呢?最主要一个原因就是我们不重视保健,不懂得保健的知识.很多人死于无知,这很冤枉啊! 大家知道怎么保健吗?国际上有个维多利亚宣言,宣言里有三 ...
- nodejs + 小程序云函数 生成小程序码
前言:这个东西坑死我了 业务需求要生成小程序码 然后我找了两天的资料 运行 生成一堆的乱码 死活就是不能生成 最后看了一遍博客 套用了一下 自己又简单的改了一下 nodejs 我是刚刚接触 有很多 ...
- BZOJ 1738: [Usaco2005 mar]Ombrophobic Bovines 发抖的牛( floyd + 二分答案 + 最大流 )
一道水题WA了这么多次真是.... 统考终于完 ( 挂 ) 了...可以好好写题了... 先floyd跑出各个点的最短路 , 然后二分答案 m , 再建图. 每个 farm 拆成一个 cow 点和一个 ...
- 【bzoj1738】[Usaco2005 mar]Ombrophobic Bovines 发抖的牛 Floyd+二分+网络流最大流
题目描述 FJ's cows really hate getting wet so much that the mere thought of getting caught in the rain m ...
- SCUT - 48 - 飞行员的配对方案 - 费用流
https://scut.online/p/48 一道二分图匹配,跑费用流就可以过了(其实最大流都可以了). #include<bits/stdc++.h> #define MAXN_ 5 ...
- 牛客2018多校第五场E-room 最小费用最大流
题意:有n个寝室,每个寝室4个人,现在在搞搬寝室的活动,告诉你每个寝室之前的人员名单,和之后的人员名单,问最少需要几个人要搬寝室. 思路: 转化为最小费用最大流解决的二分图问题,对每个去年的宿舍,向每 ...
- 2018牛客网暑期ACM多校训练营(第五场) E - room - [最小费用最大流模板题]
题目链接:https://www.nowcoder.com/acm/contest/143/E 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...
随机推荐
- 一起来学linux:SAMBA服务器搭建
前面介绍的NFS服务器的用来linux和linux系统之间共享文件和目录的,那如果是linux和windows之间需要共享修改文件该如何操作呢.这据需要用到SAMBA系统.我们首先来看下SAMBA系统 ...
- log4j 2 入门实例(3)
继承机制 所有logger都继承自root logger. 可以认为名为log4j2learn.Hello的logger继承自名为log4j2learn的logger. log4j会先查找名称是&qu ...
- API的理解和使用——全局命令
全局命令 命令 功能 set 创建键值对 keys 遍历查看所有键 exists 判断一个键是否存在,1存在,0不存在 dbsize 当前数据库中有多少个键 del 删除一个或多个键 expire 设 ...
- linux删除目录下所有文件,但是保留文件夹
删除目录和子目录下所有rpm文件,但是保留文件夹,先cd到想要删除的目录 命令如下 find ./ -name "*.rpm" | xargs rm
- LeetCode:跳跃游戏【55】
LeetCode:跳跃游戏[55] 题目描述 给定一个非负整数数组,你最初位于数组的第一个位置.数组中的每个元素代表你在该位置可以跳跃的最大长度.判断你是否能够到达最后一个位置. 示例 1: 输入: ...
- 实例化Flask的参数和对app的配置
Flask 是一个非常灵活且短小精干的web框架 , 那么灵活性从什么地方体现呢? 有一个神奇的东西叫 Flask配置 , 这个东西怎么用呢? 它能给我们带来怎么样的方便呢? 首先展示一下: from ...
- git常用开发流程
我们在使用git进行项目管理时,远程仓库的分支情况一般是: master分支作为稳定版分支,用于直接发布产品,dev分支则用于日常开发 备注: 也可以只有一个master分支,这里只介绍第一种情况. ...
- BZOJ 3362 Navigation Nightmare
一道带权并查集题目. 带权并查集的重点是信息的合并. 这类题出现得并不多,练习一下. #include<bits/stdc++.h> using namespace std; #defin ...
- POJ 之 WERTYU
WERTYU Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8371 Accepted: 4007 Descriptio ...
- BZOJ 1638 [Usaco2007 Mar]Cow Traffic 奶牛交通:记忆化搜索【图中边的经过次数】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1638 题意: 给你一个有向图,n个点,m条有向边. 对于所有从入度为0的点到n的路径,找出 ...