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 - 饲养牛 - 最大流的更多相关文章

  1. bzoj 1738 [Usaco2005 mar]Ombrophobic Bovines 发抖的牛 最大流+二分

    题目要求所有牛都去避雨的最长时间最小. 显然需要二分 二分之后考虑如何判定. 显然每头牛都可以去某个地方 但是前提是最短路径<=mid. 依靠二分出来的东西建图.可以发现这是一个匹配问题 din ...

  2. poj 3281 Dining 拆点 最大流

    题目链接 题意 有\(N\)头牛,\(F\)个食物和\(D\)个饮料.每头牛都有自己偏好的食物和饮料列表. 问该如何分配食物和饮料,使得尽量多的牛能够既获得自己喜欢的食物又获得自己喜欢的饮料. 建图 ...

  3. [No00002C]人的寿命应该能达到100至175岁-北大齐教授健康讲座笔录

      人的寿命应该能达到100 至175 岁,为什么都没有达到呢?最主要一个原因就是我们不重视保健,不懂得保健的知识.很多人死于无知,这很冤枉啊! 大家知道怎么保健吗?国际上有个维多利亚宣言,宣言里有三 ...

  4. nodejs + 小程序云函数 生成小程序码

    前言:这个东西坑死我了 业务需求要生成小程序码 然后我找了两天的资料 运行 生成一堆的乱码 死活就是不能生成 最后看了一遍博客 套用了一下 自己又简单的改了一下  nodejs 我是刚刚接触  有很多 ...

  5. BZOJ 1738: [Usaco2005 mar]Ombrophobic Bovines 发抖的牛( floyd + 二分答案 + 最大流 )

    一道水题WA了这么多次真是.... 统考终于完 ( 挂 ) 了...可以好好写题了... 先floyd跑出各个点的最短路 , 然后二分答案 m , 再建图. 每个 farm 拆成一个 cow 点和一个 ...

  6. 【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 ...

  7. SCUT - 48 - 飞行员的配对方案 - 费用流

    https://scut.online/p/48 一道二分图匹配,跑费用流就可以过了(其实最大流都可以了). #include<bits/stdc++.h> #define MAXN_ 5 ...

  8. 牛客2018多校第五场E-room 最小费用最大流

    题意:有n个寝室,每个寝室4个人,现在在搞搬寝室的活动,告诉你每个寝室之前的人员名单,和之后的人员名单,问最少需要几个人要搬寝室. 思路: 转化为最小费用最大流解决的二分图问题,对每个去年的宿舍,向每 ...

  9. 2018牛客网暑期ACM多校训练营(第五场) E - room - [最小费用最大流模板题]

    题目链接:https://www.nowcoder.com/acm/contest/143/E 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...

随机推荐

  1. jquery .html(),.text(),.val()用法

    .html()用为读取和修改元素的HTML标签 .text()用来读取或修改元素的纯文本内容 .val()用来读取或修改表单元素的value值. 这三个方法功能上的对比 .html(),.text() ...

  2. Java for LeetCode 137 Single Number II

    Given an array of integers, every element appears three times except for one. Find that single one. ...

  3. iOS 使用GitHub托管代码

    1.注册一个github账号在官网.https://github.com/github 2.下载mac版的github客户端.网址:https://desktop.github.com 3.之后会在出 ...

  4. MySQL 中事务的实现

    在关系型数据库中,事务的重要性不言而喻,只要对数据库稍有了解的人都知道事务具有 ACID 四个基本属性,而我们不知道的可能就是数据库是如何实现这四个属性的: 在这篇文章中,我们将对事务的实现进行分析, ...

  5. 简易html5贪吃蛇

    1. [图片] E6~0%QPA46ER843UQJ$0Z`H.jpg ​2. [文件] snake.html <!DOCTYPE html><html><head> ...

  6. rand()与srand()

    1.不用srand()的话 两次运行程序产生的随机数序列相同 2.用srand() 两次运行程序产生的随机数则不同 示例程序: #include<iostream> #include< ...

  7. swoole_table

    Memory Swoole提供了7个内存操作的模块,在多进程编程中可以帮助开发者实现一些特殊的需求. swoole_table 是基于共享内存和锁实现的超高性能,并发数据结构

  8. Java中内部类中使用外面变量为什么final修饰?

    所以final从语法上约束了实际上两个不同变量的一致性(表现为同一变量). 我的理解: 例如这样的代码: public void test(String str){ str="abc&quo ...

  9. [C++11新特性]第二篇

    0.可变数量参数,可变函数模版,变长模版类 c++98可变数量参数 #include<cstdio> #include<cstdarg> double SumOfFloat(i ...

  10. ACM学习历程—Hihocoder 1178 计数(位运算 && set容器)(hihoCoder挑战赛12)

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB   描述 Rowdark是一个邪恶的魔法师.在他阅读大巫术师Lich的传记时,他发现一类黑魔法来召唤远古生物,鱼丸. 魔法n能召 ...