有源汇上下界可行流(POJ2396)
题意:给出一个n*m的矩阵的每行和及每列和,还有一些格子的限制,求一组合法方案。
源点向行,汇点向列,连一条上下界均为和的边。
对于某格的限制,从它所在行向所在列连其上下界的边。
求有源汇上下界可行流即可。
具体做法可以从汇点向源点连容量为正无穷的边,转成无源汇上下界可行流。
然后可以新建超级源汇,对于一条下界为l,上界为r的边(x,y),从超级源点向y,x向超级汇点连容量为l的边,x向y连容量为r-l的边。
如果那些容量为l的边没满流,则无解。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std; const int inf = 0x3f3f3f3f, N = , M = ;
char op[];
int q,n,m,c,x,y,z,s,t,S,T,e=,fr,l[][],r[][],ans[][],hd[N],nxt[M],to[M],f[M],ch[N];
void add(int x, int y, int z) {
to[++e] = y, f[e] = z, nxt[e] = hd[x], hd[x] = e;
to[++e] = x, f[e] = , nxt[e] = hd[y], hd[y] = e;
}
void upd(int x, int y) {
if(op[] == '<') r[x][y] = min(r[x][y], z-);
else if(op[] == '>') l[x][y] = max(l[x][y], z+);
else l[x][y] = max(l[x][y], z), r[x][y] = min(r[x][y], z);
} bool tel() {
memset(ch, -, sizeof ch);
queue<int> q;
q.push(S), ch[S] = ;
while(!q.empty()) {
int u = q.front(); q.pop();
for(int i = hd[u]; i; i = nxt[i]) if(ch[to[i]] == - && f[i]) ch[to[i]] = ch[u]+, q.push(to[i]);
}
return ch[T] != -;
}
int zng(int a, int b) {
if(a == T) return b;
int r = ;
for(int i = hd[a]; i && b > r; i = nxt[i]) if(ch[to[i]] == ch[a]+ && f[i]) {
int rr = zng(to[i], min(b-r, f[i]));
f[i] -= rr, f[i^] += rr, r += rr;
}
if(!r) ch[a] = -;
return r;
} int main() {
scanf("%d", &q);
while(q--) {
e = ;
memset(hd, , sizeof hd);
memset(l, , sizeof l);
memset(r, 0x3f, sizeof r);
scanf("%d%d", &n, &m), t = n+m+, S = n+m+, T = n+m+, add(t,s,inf);
for(int i = ; i <= n; i++) scanf("%d", &x), add(S,i,x), add(s,T,x);
for(int i = ; i <= m; i++) scanf("%d", &x), add(S,t,x), add(i+n,T,x);
scanf("%d", &c);
while(c--) {
scanf("%d%d%s%d", &x, &y, op, &z);
if(!x && !y) {
for(int i = ; i <= n; i++)
for(int j = ; j <= m; j++)
upd(i,j);
} else if(!x) {
for(int i = ; i <= n; i++) upd(i,y);
} else if(!y) {
for(int i = ; i <= m; i++) upd(x,i);
} else upd(x,y);
}
if(fr) puts("");
fr = ;
for(int i = ; i <= n; i++)
for(int j = ; j <= m; j++) {
if(r[i][j] < l[i][j]) {puts("IMPOSSIBLE"); goto aa;}
add(i,j+n,r[i][j]-l[i][j]),add(S,j+n,l[i][j]),add(i,T,l[i][j]);
}
while(tel()) while(zng(S,inf));
for(int i = hd[S]; i; i = nxt[i]) if(f[i]) {puts("IMPOSSIBLE"); goto aa;}
for(int i = ; i <= n; i++)
for(int j = hd[i]; j; j = nxt[j])
if(to[j] > n && to[j] <= n+m) ans[i][to[j]-n] = f[j^];
for(int i = ; i <= n; i++)
for(int j = ; j <= m; j++)
printf("%d%c", ans[i][j]+l[i][j], " \n"[j==m]);
aa: ;
}
return ;
}
有源汇上下界可行流(POJ2396)的更多相关文章
- POJ2396 Budget [有源汇上下界可行流]
POJ2396 Budget 题意:n*m的非负整数矩阵,给出每行每列的和,以及一些约束关系x,y,>=<,val,表示格子(x,y)的值与val的关系,0代表整行/列都有这个关系,求判断 ...
- 计蒜客 31447 - Fantastic Graph - [有源汇上下界可行流][2018ICPC沈阳网络预赛F题]
题目链接:https://nanti.jisuanke.com/t/31447 "Oh, There is a bipartite graph.""Make it Fan ...
- poj2396 Budget(有源汇上下界可行流)
[题目链接] http://poj.org/problem?id=2396 [题意] 知道一个矩阵的行列和,且知道一些格子的限制条件,问一个可行的方案. [思路] 设行为X点,列为Y点,构图:连边(s ...
- poj2396有源汇上下界可行流
题意:给一些约束条件,要求算能否有可行流,ps:刚开始输入的是每一列和,那么就建一条上下界相同的边,这样满流的时候就一定能保证流量相同了,还有0是该列(行)对另一行每个点都要满足约束条件 解法:先按无 ...
- 算法复习——有源汇上下界可行流(bzoj2396)
题目: Description We are supposed to make a budget proposal for this multi-site competition. The budge ...
- ZOJ1994有源汇上下界可行流
http://fastvj.rainng.com/contest/236779#problem/G Description: n 行 m 列 给你行和 与 列和 然后有Q个限制,表示特定单元格元素大小 ...
- bzoj 2406 矩阵 —— 有源汇上下界可行流
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2406 这题,首先把题目那个式子的绝对值拆成两个限制,就成了网络流的上下界: 有上下界可行流原 ...
- bzoj千题计划158:bzoj2406: 矩阵(有源汇上下界可行流)
http://www.lydsy.com/JudgeOnline/problem.php?id=2406 设矩阵C=A-B 最小化 C 一行或一列和的最大值 整体考虑一行或者一列的和 二分最大值 这样 ...
- poj2396 Budget&&ZOJ1994 Budget[有源汇上下界可行流]
Budget Time Limit: 5 Seconds Memory Limit: 32768 KB Special Judge We are supposed to make ...
随机推荐
- Flask 学习 十二 用户评论
评论在数据库中的表示 由于评论和2个模型有关系,分别是谁发了评论,以及评论了哪个文章,所以这次要更新数据库模型 models.py 创建用户评论数据库模型 class Comment(db.Model ...
- 深入分析Java Web中的编码问题
编码问题一直困扰着我,每次遇到乱码或者编码问题,网上一查,问题解决了,但是实际的原理并没有搞懂,每次遇到,都是什么头疼. 决定彻彻底底的一次性解决编码问题. 1.为什么要编码 计算机的基本单元是字节, ...
- Codechef March Challenge 2014——The Street
The Street Problem Code: STREETTA https://www.codechef.com/problems/STREETTA Submit Tweet All submis ...
- SQL SERVER 游标的使用
首先,关于什么是游标大家可以看看这篇文章,介绍得非常详细!! SQL Server基础之游标 下面是我自己的应用场景-- 有个需求,需要把数据库表里面某一个字段的值设为随机不重复的值. 表是这样的: ...
- mingw打dll ,lib包命令和调用
1,下面的命令行将这个代码编译成 dll. gcc mydll.c -shared -o mydll.dll -Wl,--out-implib,mydll.lib 其中 -shared 告诉gcc d ...
- ajax中设置contentType: “application/json”的作用
最近在做项目交互的时候,刚开始向后台传递数据返回415,后来百度添加了 contentType:"application/json"之后返回400,然后把传输的数据格式改为json ...
- redis入门(14)redis集群下的数据分区存储
redis入门(10)redis集群下的数据分区存储
- FatMouse's Speed ~(基础DP)打印路径的上升子序列
FatMouse believes that the fatter a mouse is, the faster it runs. To disprove this, you want to take ...
- 日推20单词 Day03
1.occur v. 发生,发现 2.harvest n.收获,丰收 vt.收割,得到 3.crop n.庄稼,收成 4.yield n.产量 v.产出,屈服 5.field n.田野 6.featu ...
- POJ-1860 Currency Exchange---Bellman-Ford判断正环
题目链接: https://vjudge.net/problem/POJ-1860 题目大意: 我们的城市有几个货币兑换点.让我们假设每一个点都只能兑换专门的两种货币.可以有几个点,专门从事相同货币兑 ...