sgu176 Flow Construction【有源汇有上下界最小流】
同样是模板题。
首先将有源汇转换为无源汇,假设原来的源汇为st,我们加入的源汇为ST,那么我们应该从t到s连一条流量为+∞的边,使原来的st满足收支平衡,退化为普通节点。
分离必要边和其他边,从S到T跑最大流,所有与源或者汇相连的边都流满则证明有解。
去掉t到s容量为+∞的边,去掉必要边,从t到s跑最大流。
把得到的答案相减即可。
如果我们得到的答案是负的,那么说明它内部t到s连成了环,那么我们加上S到s容量为-ans的边,跑S到t的最大流,这样所有的边的流量应该就是0,再加上流量下界即为答案。
#include <bits/stdc++.h>
#define rep(i, a, b) for (int i = a; i <= b; i++)
#define drep(i, a, b) for (int i = a; i >= b; i--)
#define REP(i, a, b) for (int i = a; i < b; i++)
#define mp make_pair
#define pb push_back
#define clr(x) memset(x, 0, sizeof(x))
#define xx first
#define yy second
using namespace std;
typedef long long i64;
typedef pair<int, int> pii;
const int inf = ~0U >> ;
const i64 INF = ~0ULL >> ;
//****************************** const int maxn = , maxm = ; struct Ed {
int u, v, nx, c; Ed() {}
Ed(int _u, int _v, int _nx, int _c) :
u(_u), v(_v), nx(_nx), c(_c) {}
} E[maxm << ];
int G[maxn], edtot = ;
void addedge(int u, int v, int c) {
E[++edtot] = Ed(u, v, G[u], c);
G[u] = edtot;
E[++edtot] = Ed(v, u, G[v], );
G[v] = edtot;
} int level[maxn], S, T;
bool bfs(int s, int t) {
static int que[maxn]; int qh(), qt();
clr(level); level[que[++qt] = s] = ;
while (qh != qt) {
int x = que[++qh]; if (qh == maxn - ) qh = ;
for (int i = G[x]; i; i = E[i].nx) if (E[i].c && !level[E[i].v]) {
level[que[++qt] = E[i].v] = level[x] + ;
if (qt == maxn - ) qt = ;
}
}
return !!level[t];
}
int dfs(int u, int rm, int t) {
if (u == t) return rm;
int rm1 = rm;
for (int i = G[u]; i; i = E[i].nx) {
if (E[i].c && level[E[i].v] == level[u] + ) {
int flow = dfs(E[i].v, min(E[i].c, rm), t);
E[i].c -= flow, E[i ^ ].c += flow;
if ((rm -= flow) == ) break;
}
}
if (rm1 == rm) level[u] = ;
return rm1 - rm;
} int l[maxm], in[maxn];
int main() {
int n, m;
scanf("%d%d", &n, &m);
rep(i, , m) {
int x, y, a, b; scanf("%d%d%d%d", &x, &y, &a, &b);
l[i] = a * b;
if (b) in[y] += a, in[x] -= a;
addedge(x, y, a - a * b);
}
S = n + , T = n + ;
int sum();
rep(i, , n) {
if (in[i] > ) sum += in[i];
if (in[i] > ) addedge(S, i, in[i]);
else addedge(i, T, -in[i]);
}
addedge(n, , 0x3f3f3f3f);
while (bfs(S, T)) sum -= dfs(S, 0x3f3f3f3f, T);
if (sum) { puts("Impossible"); return ; }
int ans = E[edtot].c;
E[edtot].c = E[edtot ^ ].c = ;
int tmp();
while (bfs(n, )) tmp += dfs(n, 0x3f3f3f3f, );
ans -= tmp;
if (ans < ) {
addedge(S, , -ans);
while (bfs(S, n)) dfs(S, 0x3f3f3f3f, n);
ans = ;
}
printf("%d\n", ans);
rep(i, , m) {
printf(i == ? "%d" : " %d", E[(i << ) ^ ].c + l[i]);
}
puts("");
return ;
}
sgu176 Flow Construction【有源汇有上下界最小流】的更多相关文章
- loj #117. 有源汇有上下界最小流
题目链接 有源汇有上下界最小流,->上下界网络流 注意细节,边数组也要算上后加到SS,TT边. #include<cstdio> #include<algorithm> ...
- LOJ.117.[模板]有源汇有上下界最小流(Dinic)
题目链接 有源汇有上下界最小流 Sol1. 首先和无源汇网络流一样建图,求SS->TT最大流: 然后连边(T->S,[0,INF]),再求一遍SS->TT最大流,答案为新添加边的流量 ...
- Flow construction SGU - 176 有源汇有上下界最小流 二分法和回流法
/** 题目:Flow construction SGU - 176 链接:https://vjudge.net/problem/SGU-176 题意: 有源汇有上下界的最小流. 给定n个点,m个管道 ...
- sgu 176 Flow construction(有源汇的上下界最小流)
[题目链接] http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=11025 [模型] 有源汇点的上下界最小流.即既满足上下界又满足 ...
- 【 POJ - 3801】Crazy Circuits(有源汇、上下界最小流)
Description You’ve just built a circuit board for your new robot, and now you need to power it. Your ...
- bzoj 2502 清理雪道(有源汇的上下界最小流)
[题意] 有一个DAG,要求每条边必须经过一次,求最少经过次数. [思路] 有上下界的最小流. 边的下界为1,上界为无穷.构造可行流模型,先不加ts边跑一遍最大流,然后加上t->s的inf边跑 ...
- Crazy Circuits HDU - 3157(有源汇有上下界最小流)
给出每条边的下界 求最小流 板题 提供两个板子代码 虽然这个题 第一个比较快 但在loj上https://loj.ac/problem/117 的板题 第一个1700+ms 第二个才600+ms ...
- LOJ117 有源汇有上下界最小流(上下界网络流)
跑出可行流后从原来的汇点向原来的源点跑最大流,原图最小流=inf-maxflow.显然超源超汇的相关边对其也没有影响.原图最小流=可行流-原图新增流量,因为t向s流量增加相当于s向t流量减少.但为什么 ...
- bzoj2502: 清理雪道(有源汇有上下界最小流)
传送门 别说话,自己看,我不会->这里 我这里用的建图方法是先跑一次最大流,连上$(t,s,inf)$之后再跑一遍,然后答案就是之前连的那条边的反向边的流量 据说还有种方法是连上$(t,s,in ...
随机推荐
- RMQ 详解
RMQ(Range Minimum/Maximum Query)问题:RMQ问题是给定一个区间,求这个区间中的最大或最小值的问题 RMQ采用动态规划的思想来求解:(st算法:Square Table) ...
- CodeForces 682C Alyona and the Tree(广搜 + 技巧)
方法:从根节点开始广搜,如果遇到了应该删除的点,就再广搜删掉它的子树并标记,然后统计一下被标记的个数就是答案,所谓技巧就是从根节点开始搜索的时候,如果遇到了某个节点的距离<0,就让它是0,0可以 ...
- unit正交相机Size的计算公式
如:相机的大小为800*480,要使相机适应800*480像素的图,则 Size = 相机高/2/像素单位 = 480/2/100 = 2.4
- Python CGI编程和CGIHTTPServer
Python2.7 的CGIHTTPServer 可以作为一个简单的HTTP服务器,能够调用cgi脚本 1 在任意目录下创建一个特殊的目录 cgi-bin ,用于存放自己写的脚本(.py或.cgi) ...
- xdebug 安装
如果是这样的话,请参考 http://www.mengyunzhi.com/share/php/107-xdebug.html 进行xdebug的安装.
- 连接Oracle数据库的Hibernate配置文件
连接Oracle数据库的Hibernate配置文件连接Oracle的Hibernate配置文件有两种格式,一种是xml格式的,另一种是Java属性文件格式的.下面分别给出这两种格式配置文件的代码. 1 ...
- 设置DIV根据内容自动调整高度的三个方法
Div即父容器在Firefox.Chrome.Safari中不会根据内容自动调节高度,我们看下面的HTML代码: <divid="main"><divid=&qu ...
- 1084:XX开公司<回溯>
Description 2020年,xx开了一家拥有N个员工的大公司.每天,xx都要分配N项工作给他的员工,但是,由于能力的不同,每个人对处理相同工作所需要的时间有快有慢.众所周知,xx是一个非常重视 ...
- android Service Activity三种交互方式(付源码)(转)
android Service Activity三种交互方式(付源码) Android应用服务器OSBeanthread android Service Binder交互通信实例 最下边有源代码: ...
- brbustoj 1818 石子合并问题--直线版
比较经典且基础的区间dp,转移方程为 dp_max[i][j] = max(dp_max[i][j],dp_max[i][k] + dp_max[k+1][j] + sum[j]-sum[i-1]); ...