【Luogu】P1231教辅的组成(拆点+Dinic+当前弧优化)
妈耶
我的图建反了两次 准确的说是有两个地方建反了,然后反上加反改了一个小时……
知道为什么要拆点吗?

假设这是你的图 左边到右边依次是超级源点 练习册 书 答案 超级汇点
请问这张图的最大流是多少?
如果把中间拆成这样:

Book-in是跟练习册匹配的书的入端,Book-out是跟答案匹配的书的出端。相当于每本书都是一条隧道,有入口有出口,每本书的入口和对应的出口连边。
请问现在这张图的最大流是多少?
所以你看。
代码放上:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype> inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} struct Edge{
int next,to,val;
}edge[];
int head[],num=-;
inline void add(int from,int to,int val){
edge[++num]=(Edge){ head[from],to,val};
head[from]=num;
} bool vis[];
int dfn[];
int list[];
int f[],h,t=;
int n,m,Start,End; bool bfs(){
memset(vis,,sizeof(vis));
f[]=Start;vis[Start]=;dfn[Start]=;h=;t=;
while(h++<t){
int from=f[h];
for(int i=head[from];i!=-;i=edge[i].next){
int to=edge[i].to;
if(vis[to]||(!edge[i].val)) continue;
dfn[to]=dfn[from]+;
vis[to]=;
f[++t]=to;
}
}
return vis[End];
} int dfs(int x,int val){
if(x==End||val==) return val;
int flow=;
vis[x]=;
for(int &i=list[x];i!=-;i=edge[i].next){
int to=edge[i].to;
if(dfn[to]==dfn[x]+&&!vis[to]&&edge[i].val>){
int now=dfs(to,std::min(edge[i].val,val));
if(now>){
edge[i].val-=now;
edge[i^].val+=now;
flow+=now;val-=now;
if(val<=) break;
}
}
}
if(flow!=val) dfn[x]=-;
return flow;
} int ans; int main(){
memset(head,-,sizeof(head));
int n1=read(),n2=read(),n3=read();
int n=n1*+n2;int N=n+n3;End=N+;
int m1=read();
for(int i=;i<=m1;++i){
int book=read(),note=read();
add(note+n1*,book,);
add(book,note+n1*,);
}
int m2=read();
for(int i=;i<=m2;++i){
int book=read(),ansnote=read();
add(book+n1,ansnote+n,);
add(ansnote+n,book+n1,);
}
for(int i=;i<=n1;++i){
add(i,i+n1,);
add(i+n1,i,);
}
for(int i=;i<=n2;++i){
add(Start,i+n1*,);
add(i+n1*,Start,);
}
for(int i=;i<=n3;++i){
add(i+n,End,);
add(End,i+n,);
}
while(bfs()){
memset(vis,,sizeof(vis));
for(int i=;i<=End;++i) list[i]=head[i];
int now=dfs(Start,0x7fffffff);
if(!now) break;
ans+=now;
}
printf("%d",ans);
return ;
}
话说当前弧优化真好用
【Luogu】P1231教辅的组成(拆点+Dinic+当前弧优化)的更多相关文章
- Luogu P1231 教辅的组成
Luogu P1231 教辅的组成 题目背景 滚粗了的HansBug在收拾旧语文书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还 ...
- ARC085E(最小割规划【最大流】,Dinic当前弧优化)
#include<bits/stdc++.h>using namespace std;typedef long long ll;const ll inf=0x3f3f3f3f;int cn ...
- Dinic当前弧优化 模板及教程
在阅读本文前,建议先自学最大流的Ek算法. 引入 Ek的核心是执行bfs,一旦找到增广路就停下来进行增广.换言之,执行一遍BFS执行一遍DFS,这使得效率大大降低.于是我们可以考虑优化. 核心思路 在 ...
- [Poj2112][USACO2003 US OPEN] Optimal Milking [网络流,最大流][Dinic+当前弧优化]
题意:有K个挤奶机编号1~K,有C只奶牛编号(K+1)~(C+K),每个挤奶机之多能挤M头牛,现在让奶牛走到挤奶机处,求奶牛所走的最长的一条边至少是多少. 题解:从起点向挤奶机连边,容量为M,从挤奶机 ...
- P3376 网络流-最大流模板题(Dinic+当前弧优化)
(点击此处查看原题) Dinic算法 Dinic算法相对于EK算法,主要区别在于Dinic算法对图实现了分层,使得我们可以用一次bfs,一次dfs使得多条增广路得到增广 普通的Dinic算法已经可以处 ...
- HDU 4280 Island Transport(dinic+当前弧优化)
Island Transport Description In the vast waters far far away, there are many islands. People are liv ...
- 【luogu P1231 教辅的组成】 题解
题目链接:https://www.luogu.org/problemnew/show/P1231 对于每本书只能用一次,所以拆点再建边 #include <queue> #include ...
- P1231 教辅的组成 拆点限流
如果只有两个物品的话 是一个裸的二分图匹配问题 现在变成了三个物品之间的匹配 则只要在中间加一层节点表示书 再把这层的每个点拆成两个点中间连一条边限制流量 使其只能用一次 #include<io ...
- 网络流小记(EK&dinic&当前弧优化&费用流)
欢 迎 来 到 网 络 瘤 的 世 界 什么是网络流? 现在我们有一座水库,周围有n个村庄,每个村庄都需要水,所以会修水管(每个水管都有一定的容量,流过的水量不能超过容量).最终水一定会流向唯一一个废 ...
随机推荐
- linux 下node升级
npm install -g n n stable 安装的路径: cd /usr/local/n/versions/node/10.15.3 修改环境变量 cd /etc sudo vim profi ...
- XPath基本使用
一.简介 1.什么是XPath 1)XPath是W3C的一个标准 2)XPath 是一门在 XML 文档中查找信息的语言. 3)XPath 用于在 XML 文档中通过元素和属性进行导航. 4)XPa ...
- 覆盖alert对话框-自制Jquery.alert插件
Javascript 代码: (function ($) { 'use strict'; window.alert = $.alert = function (msg) { var defaultOp ...
- GNU make(2)
GNU make(2) 参考: GNU Make学习总结(二) 变量 变量由一个前导符号$加上字符或者是括号字符组成, 名称区分大小写. 命名: 习惯上用全部大写字符表示常量, 小写字符表示变量, 单 ...
- Asp.Net Core 进阶(一) —— 读取appsettings.json
我们以前在Asp.Net MVC中使用 System.Configuration.ConfigurationManager 来读取web.config文件.但是Asp.Net Core MVC已经没有 ...
- rpn网络结构再分析
这是rpn网络train阶段的网络结构图 rpn_conv1之前的网络是特征提取层,也是和fast rcnn共享的层.rpn_conv1是一层1*1的卷积,这一层是单独为rpn网络多提取一层特征,这一 ...
- CPP-基础:关于引用
1.什么是“引用”?申明和使用“引用”要注意哪些问题? 引用就是某个目标变量的“别名”(alias),对应用的操作与对变量直接操作效果完全相同. 申明一个引用的时候,切记要对其进行初始化. 引用声明完 ...
- python之for (循环)
格式: for 循环 for i in s: print(i) # for 关键字 # i 变量 # in 关键字 # s 可迭代对象 int - bool pass和- # for a in &qu ...
- jquery操作滚动条滚动到指定元素位置 scrollTop
$('.brand_t a').bind('click',function(){ if($(this).attr('title1')){ var toChar = $(this).attr('titl ...
- git 的.gitignore
# vs code .vscode # Logs *.log #npm node_modules