题意:给出一个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)的更多相关文章

  1. POJ2396 Budget [有源汇上下界可行流]

    POJ2396 Budget 题意:n*m的非负整数矩阵,给出每行每列的和,以及一些约束关系x,y,>=<,val,表示格子(x,y)的值与val的关系,0代表整行/列都有这个关系,求判断 ...

  2. 计蒜客 31447 - Fantastic Graph - [有源汇上下界可行流][2018ICPC沈阳网络预赛F题]

    题目链接:https://nanti.jisuanke.com/t/31447 "Oh, There is a bipartite graph.""Make it Fan ...

  3. poj2396 Budget(有源汇上下界可行流)

    [题目链接] http://poj.org/problem?id=2396 [题意] 知道一个矩阵的行列和,且知道一些格子的限制条件,问一个可行的方案. [思路] 设行为X点,列为Y点,构图:连边(s ...

  4. poj2396有源汇上下界可行流

    题意:给一些约束条件,要求算能否有可行流,ps:刚开始输入的是每一列和,那么就建一条上下界相同的边,这样满流的时候就一定能保证流量相同了,还有0是该列(行)对另一行每个点都要满足约束条件 解法:先按无 ...

  5. 算法复习——有源汇上下界可行流(bzoj2396)

    题目: Description We are supposed to make a budget proposal for this multi-site competition. The budge ...

  6. ZOJ1994有源汇上下界可行流

    http://fastvj.rainng.com/contest/236779#problem/G Description: n 行 m 列 给你行和 与 列和 然后有Q个限制,表示特定单元格元素大小 ...

  7. bzoj 2406 矩阵 —— 有源汇上下界可行流

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2406 这题,首先把题目那个式子的绝对值拆成两个限制,就成了网络流的上下界: 有上下界可行流原 ...

  8. bzoj千题计划158:bzoj2406: 矩阵(有源汇上下界可行流)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2406 设矩阵C=A-B 最小化 C 一行或一列和的最大值 整体考虑一行或者一列的和 二分最大值 这样 ...

  9. poj2396 Budget&&ZOJ1994 Budget[有源汇上下界可行流]

    Budget Time Limit: 5 Seconds      Memory Limit: 32768 KB      Special Judge We are supposed to make ...

随机推荐

  1. Flask 学习 十二 用户评论

    评论在数据库中的表示 由于评论和2个模型有关系,分别是谁发了评论,以及评论了哪个文章,所以这次要更新数据库模型 models.py 创建用户评论数据库模型 class Comment(db.Model ...

  2. 深入分析Java Web中的编码问题

    编码问题一直困扰着我,每次遇到乱码或者编码问题,网上一查,问题解决了,但是实际的原理并没有搞懂,每次遇到,都是什么头疼. 决定彻彻底底的一次性解决编码问题. 1.为什么要编码 计算机的基本单元是字节, ...

  3. Codechef March Challenge 2014——The Street

    The Street Problem Code: STREETTA https://www.codechef.com/problems/STREETTA Submit Tweet All submis ...

  4. SQL SERVER 游标的使用

    首先,关于什么是游标大家可以看看这篇文章,介绍得非常详细!! SQL Server基础之游标 下面是我自己的应用场景-- 有个需求,需要把数据库表里面某一个字段的值设为随机不重复的值. 表是这样的: ...

  5. mingw打dll ,lib包命令和调用

    1,下面的命令行将这个代码编译成 dll. gcc mydll.c -shared -o mydll.dll -Wl,--out-implib,mydll.lib 其中 -shared 告诉gcc d ...

  6. ajax中设置contentType: “application/json”的作用

    最近在做项目交互的时候,刚开始向后台传递数据返回415,后来百度添加了 contentType:"application/json"之后返回400,然后把传输的数据格式改为json ...

  7. redis入门(14)redis集群下的数据分区存储

    redis入门(10)redis集群下的数据分区存储

  8. FatMouse's Speed ~(基础DP)打印路径的上升子序列

    FatMouse believes that the fatter a mouse is, the faster it runs. To disprove this, you want to take ...

  9. 日推20单词 Day03

    1.occur v. 发生,发现 2.harvest n.收获,丰收 vt.收割,得到 3.crop n.庄稼,收成 4.yield n.产量 v.产出,屈服 5.field n.田野 6.featu ...

  10. POJ-1860 Currency Exchange---Bellman-Ford判断正环

    题目链接: https://vjudge.net/problem/POJ-1860 题目大意: 我们的城市有几个货币兑换点.让我们假设每一个点都只能兑换专门的两种货币.可以有几个点,专门从事相同货币兑 ...