同样是模板题。

  首先将有源汇转换为无源汇,假设原来的源汇为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【有源汇有上下界最小流】的更多相关文章

  1. loj #117. 有源汇有上下界最小流

    题目链接 有源汇有上下界最小流,->上下界网络流 注意细节,边数组也要算上后加到SS,TT边. #include<cstdio> #include<algorithm> ...

  2. LOJ.117.[模板]有源汇有上下界最小流(Dinic)

    题目链接 有源汇有上下界最小流 Sol1. 首先和无源汇网络流一样建图,求SS->TT最大流: 然后连边(T->S,[0,INF]),再求一遍SS->TT最大流,答案为新添加边的流量 ...

  3. Flow construction SGU - 176 有源汇有上下界最小流 二分法和回流法

    /** 题目:Flow construction SGU - 176 链接:https://vjudge.net/problem/SGU-176 题意: 有源汇有上下界的最小流. 给定n个点,m个管道 ...

  4. sgu 176 Flow construction(有源汇的上下界最小流)

    [题目链接] http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=11025 [模型] 有源汇点的上下界最小流.即既满足上下界又满足 ...

  5. 【 POJ - 3801】Crazy Circuits(有源汇、上下界最小流)

    Description You’ve just built a circuit board for your new robot, and now you need to power it. Your ...

  6. bzoj 2502 清理雪道(有源汇的上下界最小流)

    [题意] 有一个DAG,要求每条边必须经过一次,求最少经过次数. [思路] 有上下界的最小流.  边的下界为1,上界为无穷.构造可行流模型,先不加ts边跑一遍最大流,然后加上t->s的inf边跑 ...

  7. Crazy Circuits HDU - 3157(有源汇有上下界最小流)

    给出每条边的下界 求最小流 板题 提供两个板子代码 虽然这个题 第一个比较快 但在loj上https://loj.ac/problem/117 的板题  第一个1700+ms 第二个才600+ms   ...

  8. LOJ117 有源汇有上下界最小流(上下界网络流)

    跑出可行流后从原来的汇点向原来的源点跑最大流,原图最小流=inf-maxflow.显然超源超汇的相关边对其也没有影响.原图最小流=可行流-原图新增流量,因为t向s流量增加相当于s向t流量减少.但为什么 ...

  9. bzoj2502: 清理雪道(有源汇有上下界最小流)

    传送门 别说话,自己看,我不会->这里 我这里用的建图方法是先跑一次最大流,连上$(t,s,inf)$之后再跑一遍,然后答案就是之前连的那条边的反向边的流量 据说还有种方法是连上$(t,s,in ...

随机推荐

  1. [转]intent 传递对象

    ---恢复内容开始--- Activity之间通过Intent传递值,支持基本数据类型和String对象及它们的数组对象byte.byte[].char.char[].boolean.boolean[ ...

  2. UVALive 2323 Modular Multiplication of Polynomials(模拟)

    这是一个相对简单的模拟,因为运算规则已经告诉了我们,并且比较简单,不要被吓到…… 思路:多项式除以另外一个多项式,如果能除,那么他的最高次一定被降低了,如果最高次不能被降低,那说明已经无法被除,就是题 ...

  3. Linux学习 -- 系统管理

    1 进程管理 判断服务器健康状态 top [选项] 查看系统中所有进程 ps aux      BSD格式 ps -le        Linux格式 pstree [选项] -p   显示PID - ...

  4. ormlite 删除操作

    ormlite删除操作 DeleteBuilder<TransferDetailDtl, Integer> deleteBuilder = mRawDao.deleteBuilder(); ...

  5. Chapter 1 First Sight——21

    They were sitting in the corner of the cafeteria, as far away from where I sat as possible in the lo ...

  6. Linux 查看 硬件配置

    一:查看cpu more /proc/cpuinfo | grep "model name" grep "model name" /proc/cpuinfo 如 ...

  7. 优化Android App性能?十大技巧必知!

    无论锤子还是茄子手机的不断冒出,Android系统的手机市场占有率目前来说还是最大的,因此基于Android开发的App数量也是很庞大的.那么,如何能开发出更高性能的Android App?相信是软件 ...

  8. 转: 两个 Shell 网站: explainshell 和 shellcheck

    今天向大家介绍两个有意思的 Shell 网站,一个是 explainshell.com,另一个是 shellcheck.net. explainshell 先说 explainshell.explai ...

  9. 我的android学习脚步----------- 的第一个应用

    刚刚开始学android开发,以前都是在别人调好的应用中修改JNI,现在需要自己一步步走 开发环境:Eclipse+ADT 配置不多讲了,引自:http://www.cnblogs.com/allen ...

  10. IOS 9人机界面指南(1)

    http://www.uisdc.com/ios9-interface-guideline-ui