LOJ #116 有源汇点有上下界的最大流
先连一条从汇点到源点的容量为INF的边,将其转化成无源汇点有上下界的可行流,判断是否可行
若可行的话删掉超级源点和超级汇点,再跑一遍最大流即可
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <cstdlib>
using namespace std;
const int MAXM=30005,MAXN=250;
int init(){
int rv=0,fh=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') fh=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
rv=(rv<<1)+(rv<<3)+c-'0';
c=getchar();
}
return fh*rv;
}
queue <int> q;
int n,m,s,t,ss,tt,maxflow,head[MAXN],dep[MAXN],cur[MAXN],nume;
struct edge{
int to,nxt,cap,flow;
}e[MAXM<<1];
void adde(int from,int to,int cap){
e[++nume].to=to;
e[nume].cap=cap;
e[nume].nxt=head[from];
head[from]=nume;
}
bool bfs(int s,int t){
memset(dep,0,sizeof(dep));
q.push(s);dep[s]=1;
while(!q.empty()){
int u=q.front();q.pop();
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(s!=ss&&v==ss) continue;
if(s!=ss&&v==tt) continue;
if(!dep[v]&&e[i].flow<e[i].cap){
dep[v]=dep[u]+1;
q.push(v);
}
}
}
return dep[t];
}
int dfs(int u,int flow,int t){
if(u==t) return flow;
int tot=0;
for(int &i=cur[u];i&&tot<flow;i=e[i].nxt){
int v=e[i].to;
if(dep[v]==dep[u]+1&&e[i].flow<e[i].cap){
if(int temp=dfs(v,min(flow-tot,e[i].cap-e[i].flow),t)){
e[i].flow+=temp;
e[((i-1)^1)+1].flow-=temp;
tot+=temp;
}
}
}
return tot;
}
void dinic(int s,int t){
while(bfs(s,t)){
for(int i=1;i<=n+2;i++) cur[i]=head[i];
maxflow+=dfs(s,0x3f3f3f3f,t);
}
}
int main(){
n=init();m=init();s=init();t=init();
ss=n+1;tt=n+2;
int tot=0;
for(int i=1;i<=m;i++){
int u=init(),v=init(),c=init(),d=init();
adde(u,v,d-c);
adde(v,u,0);
adde(u,tt,c);
adde(tt,u,0);
adde(ss,v,c);
adde(v,ss,0);
tot+=c;
}
adde(t,s,0x3f3f3f3f);
dinic(ss,tt);
if(maxflow<tot){
printf("please go home to sleep\n");
}else{
dinic(s,t);
maxflow=0;
for(int i=head[s];i;i=e[i].nxt) maxflow+=e[i].flow;
cout<<maxflow<<endl;
}
return 0;
}
LOJ #116 有源汇点有上下界的最大流的更多相关文章
- loj #116. 有源汇有上下界最大流
题目链接 有源汇有上下界最大流,->上下界网络流 注意细节,重置cur和dis数组时,有n+2个点 #include<cstdio> #include<algorithm> ...
- 2018.08.20 loj#116. 有源汇有上下界最大流(模板)
传送门 貌似就是转成无源汇,然后两遍最大流搞定? 其实第二遍跑最大流是自动加上了第一次的答案. 代码: #include<bits/stdc++.h> #define N 100005 # ...
- LibreOJ #116. 有源汇有上下界最大流
二次联通门 : LibreOJ #116. 有源汇有上下界最大流 /* LibreOJ #116. 有源汇有上下界最大流 板子题 我也就会写写板子题了.. 写个板子第一个点还死活过不去... 只能打个 ...
- Loj#116-[模板]有源汇有上下界最大流
正题 题目链接:https://loj.ac/p/116 题目大意 \(n\)个点\(m\)条边的一张图,每条边有流量上下限制,求源点到汇点的最大流. 解题思路 先别急着求上面那个,考虑一下怎么求无源 ...
- loj #117. 有源汇有上下界最小流
题目链接 有源汇有上下界最小流,->上下界网络流 注意细节,边数组也要算上后加到SS,TT边. #include<cstdio> #include<algorithm> ...
- Shoot the Bullet ZOJ - 3229 有源汇有上下界的最大流
/** zoj提交评判不了,所以不知道代码正不正确.思路是应该没问题的.如果有不对的地方,请多指教. 题目:Shoot the Bullet ZOJ - 3229 链接:https://vjudge. ...
- zoj3229 Shoot the Bullet(有源汇有上下界的最大流)
题意: 一个屌丝给m个女神拍照,计划拍照n天,每一天屌丝给给定的C个女神拍照,每天拍照数不能超过D张,而且给每个女神i拍照有数量限制[Li,Ri],对于每个女神n天的拍照总和不能少于Gi,如果有解求屌 ...
- zoj 3229 有源汇有上下界的最大流模板题
/*坑啊,pe的程序在zoj上原来是wa. 题目大意:一个屌丝给m个女神拍照.计划拍照n天,每一天屌丝最多个C个女神拍照,每天拍照数不能超过D张,并且给每一个女神i拍照有数量限制[Li,Ri], 对于 ...
- sgu 176 有源汇有上下界的最小流模板题
/*参考博文:http://hi.baidu.com/dragon_eric123/item/82e259200ece744046996282 有上下界的有源最小流 */ #include<st ...
随机推荐
- 树形dp总结
转自 http://blog.csdn.net/angon823 介绍 1.什么是树型动态规划 顾名思义,树型动态规划就是在"树"的数据结构上的动态规划,平时作的动态规划都是线性的 ...
- HTML5基础篇章1
①<!DOCTYPE>(声明文档类型): <!DOCTYPE>必须要声明在文档的第一行,而且要在html标签之前 . <!DOCTYPE>是一条规定页面使用那个ht ...
- c语言基础学习09_复合类型
=============================================================================涉及到的知识点有:一.结构体1.定义结构体st ...
- 微信小程序多列选择器之range-key
<picker mode="multiSelector" bindchange="bindMultiPickerChange2" bindcolumnch ...
- linux 树型显示文件 tree ls tree 命令
原创 2016年07月27日 09:50:19 yum install tree tree www │?? │?? │?? └── xml.test │?? │?? └── valgrind.su ...
- dedecms 下载时弹出提示登录框或直接下载
http://jingyan.baidu.com/article/9f63fb918656c2c8400f0ebc.html DEDECMS 默认下载 是直接给出了一个 本地下载的 下载链接 本 ...
- xtrabackup全量备份和增(差)量备份
xtrabackup全量备份和增(差)量备份 1.xtrabackup全量备份和恢复 1)备份: innobackupex --default-file=/PATH/TO/DEFAULT --host ...
- Dos下的小技巧
1.dos 窗口下怎样复制粘贴 第一种方式:右键标记-->选中-->标题栏右键编辑-->复制 第二种方式:右键-->标记-->选中-->enter 这样就可以复制了 ...
- [转] 分享一个快的飞起的maven的settings.xml文件
<?xml version="1.0"?> <settings> <localRepository>/home/yizhen/.m2/repos ...
- 安装python的注意事项
第一步: 下载安装文件 python-3.5.2.exe 第二步: 点击安装,下一步继续 第三步: 配置环境变量,记住第一次安装时的路径. 第四步: 测试,打开CMD,输入python.若未找到命令 ...