P1231 教辅的组成(最大流)
P1231 教辅的组成
这个题一看便知是网络流量,(三分图??滑稽..)
就一个小细节,如果我们仅仅将所有的点分成三部分跑网络流的话会有点小问题..
因为这可能导致一本书被重复利用,就是有两条流经过同一本书,这样的话,我们就要通过限流的手段使得流经每本书的流只能是一.
我们将每本书拆成两个,再在两个点之间连一条1的边即可...
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=40010,INF=1e9;
int link[N],tot=1,n1,n2,n3,s,t,d[N],current[N],m1,m2;
struct edge{int y,v,next;}a[N*1000];
inline int read()
{
int x=0,ff=1;
char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') ff=-1;ch=getchar();}
while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*ff;
}
inline void add(int x,int y,int v)
{
a[++tot].y=y;a[tot].v=v;a[tot].next=link[x];link[x]=tot;
a[++tot].y=x;a[tot].v=0;a[tot].next=link[y];link[y]=tot;
}
inline bool bfs()
{
queue<int>q;q.push(s);
memset(d,0,sizeof(d));
memcpy(current,link,sizeof(current));
d[s]=1;
while(!q.empty())
{
int x=q.front();q.pop();
for(int i=link[x];i;i=a[i].next)
{
int y=a[i].y;
if(d[y]||!a[i].v) continue;
d[y]=d[x]+1;
q.push(y);
if(y==t) return true;
}
}
return false;
}
inline int dinic(int x,int flow)
{
if(x==t) return flow;
int rest=flow,k;
for(int i=current[x];i&&rest;i=a[i].next)
{
current[x]=i;
int y=a[i].y;
if(d[y]==d[x]+1&&a[i].v)
{
k=dinic(y,min(rest,a[i].v));
if(!k) d[y]=0;
a[i].v-=k;
a[i^1].v+=k;
rest-=k;
}
}
return flow-rest;
}
int main()
{
freopen("1.in","r",stdin);
n1=read();n2=read();n3=read();
//书:1 - 2*n1,练习册:2*n1+1 - 2*n1+n2,答案:2*n1+n2+1 - 2*n1+n2+n3.
s=0;t=n1*2+n2+n3+1;
m1=read();
for(int i=1;i<=m1;++i)
{
int x=read(),y=read();
add(y+n1*2,x,1);
}
m2=read();
for(int i=1;i<=m2;++i)
{
int x=read(),y=read();
add(x+n1,y+n1*2+n2,1);
}
for(int i=1;i<=n1;++i) add(i,i+n1,1);
for(int i=1;i<=n2;++i) add(s,n1*2+i,1);
for(int i=1;i<=n3;++i) add(n1*2+n2+i,t,1);
int maxflow=0,flow;
while(bfs())
while(flow=dinic(s,INF)) maxflow+=flow;
printf("%d",maxflow);
return 0;
}
P1231 教辅的组成(最大流)的更多相关文章
- 洛谷P1231 教辅的组成 最大流
裸题… Code: #include<cstdio> #include<cstring> #include<algorithm> #include<vecto ...
- 洛谷——P1231 教辅的组成
P1231 教辅的组成 题目背景 滚粗了的HansBug在收拾旧语文书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还包含一份练习 ...
- 【解题报告】洛谷 P1231 教辅的组成
[解题报告]洛谷 P1231 教辅的组成 题目链接 CSDN链接 这道题就只是一道普通的最大流问题,但是关键所在就是如何构图.要不是我看了题解,真的想不到这个构图方法呢 题目大意我就不写了,自己看好了 ...
- Luogu P1231 教辅的组成
Luogu P1231 教辅的组成 题目背景 滚粗了的HansBug在收拾旧语文书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还 ...
- 洛谷 P1231 教辅的组成
P1231 教辅的组成 题目背景 滚粗了的HansBug在收拾旧语文书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还包含一份练习 ...
- 洛谷 P1231 教辅的组成(网络最大流+拆点加源加汇)
题目背景 滚粗了的HansBug在收拾旧语文书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还包含一份练习题.然而出现在他眼前的书 ...
- P1231 教辅的组成 拆点限流
如果只有两个物品的话 是一个裸的二分图匹配问题 现在变成了三个物品之间的匹配 则只要在中间加一层节点表示书 再把这层的每个点拆成两个点中间连一条边限制流量 使其只能用一次 #include<io ...
- P1231 教辅的组成
传送门:https://www.luogu.org/problemnew/show/P1231 这是一道很不错的网络流入门题,关键在于如何建图. 首先,我们将练习册和源点连一条边权为1的边,然后若书 ...
- 【luogu P1231 教辅的组成】 题解
题目链接:https://www.luogu.org/problemnew/show/P1231 对于每本书只能用一次,所以拆点再建边 #include <queue> #include ...
随机推荐
- CodeForce-803C Maximal GCD(贪心数学)
Maximal GCD CodeForces - 803C 现在给定一个正整数 n.你需要找到 k 个严格递增的正整数 a1, a2, ..., ak,满足他们的和等于 n 并且他们的最大公因数尽量大 ...
- 学习了解PHP中的SeasLog日志扩展
今天来学习的扩展是和日志相关的一个扩展,对于 PHP 的日志应用来说,除了本身自带的 error_log() . syslog() 之外,在大多数的框架中还会经常见到 monolog 的踪影.当然,我 ...
- Java基础系列(28)- 方法的定义和调用
方法的定义 Java的方法类似于其他语言的函数,是一段用来完成特定功能的代码片段,一般情况下,定义一个方法包含以下语法: 修饰符 返回值类型 方法名(参数类型 参数名){ -- 方法体 -- retu ...
- 博客主题-Next风格
适配方法 下载压缩包,按照文件名将内容复制粘贴到对应框中即可. 注意事项 请将主题设置为custom 禁用默认css 下载连接 Next.rar version:2020-07-10 next.rar ...
- Appium+Python自动化环境搭建-1
前言 appium可以说是做app最火的一个自动化框架,它的主要优势是支持android和ios,另外脚本语言也是支持java和Python. 小编擅长Python,所以接下来的教程是appium+p ...
- DBeaver MSSQL 支持TLS设置
DBeaver是一个基于 Java 开发,免费开源的通用数据库管理和开发工具,使用非常友好的 ASL 协议.可以通过官方网站或者 Github 进行下载. 由于 DBeaver 基于 Java 开发, ...
- centos7有关于防火墙的命令
查看防火墙状态 firewall-cmd --state 开启防火墙 systemctl start firewalld.service 关闭防火墙 systemctl stop firewalld. ...
- MyBatis 面试复习整理
MyBatis MyBatis 是一款优秀的ORM(对象关系映射)框架,可以通过对象和数据库之间的映射,将程序中的对象自动存储到数据库中.它内部封装了 JDBC ,使开发者只需要关注 SQL语句本身, ...
- 设置 SSH 命令行空闲保持会话
楔子 使用 Mac 或 Linux 原生的命令行 ssh user@ip 方式连接 Linux 闲时会自动断开终端卡死. 为解决这个问题,查了到篇博客翻译下关键步骤记录下来.解决方式可以分服务端设置和 ...
- JS返回一个字符串中长度最小的单词的长度
题目:编写一个方法,返回字符串中最小长度的单词的长度. var str = 'What a good day today!'; 1 //方法一 2 function returnString1(str ...