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 ...
随机推荐
- jquery .html(),.text(),.val()用法
.html()用为读取和修改元素的HTML标签 .text()用来读取或修改元素的纯文本内容 .val()用来读取或修改表单元素的value值. 这三个方法功能上的对比 .html(),.text() ...
- Java for LeetCode 137 Single Number II
Given an array of integers, every element appears three times except for one. Find that single one. ...
- iOS 使用GitHub托管代码
1.注册一个github账号在官网.https://github.com/github 2.下载mac版的github客户端.网址:https://desktop.github.com 3.之后会在出 ...
- MySQL 中事务的实现
在关系型数据库中,事务的重要性不言而喻,只要对数据库稍有了解的人都知道事务具有 ACID 四个基本属性,而我们不知道的可能就是数据库是如何实现这四个属性的: 在这篇文章中,我们将对事务的实现进行分析, ...
- 简易html5贪吃蛇
1. [图片] E6~0%QPA46ER843UQJ$0Z`H.jpg 2. [文件] snake.html <!DOCTYPE html><html><head> ...
- rand()与srand()
1.不用srand()的话 两次运行程序产生的随机数序列相同 2.用srand() 两次运行程序产生的随机数则不同 示例程序: #include<iostream> #include< ...
- swoole_table
Memory Swoole提供了7个内存操作的模块,在多进程编程中可以帮助开发者实现一些特殊的需求. swoole_table 是基于共享内存和锁实现的超高性能,并发数据结构
- Java中内部类中使用外面变量为什么final修饰?
所以final从语法上约束了实际上两个不同变量的一致性(表现为同一变量). 我的理解: 例如这样的代码: public void test(String str){ str="abc&quo ...
- [C++11新特性]第二篇
0.可变数量参数,可变函数模版,变长模版类 c++98可变数量参数 #include<cstdio> #include<cstdarg> double SumOfFloat(i ...
- ACM学习历程—Hihocoder 1178 计数(位运算 && set容器)(hihoCoder挑战赛12)
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Rowdark是一个邪恶的魔法师.在他阅读大巫术师Lich的传记时,他发现一类黑魔法来召唤远古生物,鱼丸. 魔法n能召 ...