题意:给出一个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. iOS Storyboard unwind segues使用小结

    使用storyboard开发的时候,经常会在一个scene上添加一个button,再拖拽这个button到某个想要关联的页面,最后选择push的方式跳转.这样scene_A和scene_B就有了一个& ...

  2. nyoj Color the fence

    Color the fence 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 Tom has fallen in love with Mary. Now Tom w ...

  3. Python机器学习—导入各种数据的N种办法

    pandas 读取数据 一.导入一般的文件 1.read_csv(),用来读取CSV文件 官方文档是这么说的:Read CSV (comma-separated) file into DataFram ...

  4. 09_Python定义方法_Python编程之路

    有关Python判断与循环的内容我们上几节已经跟大家一起学习了,这一节我们主要针对def 做一个讲解 def 定义一个方法 在项目编程中,我们往往要做很多重复的事,比如一个排序的功能(当然Python ...

  5. confluence搭建详情

    Confluence安装&破解&汉化 编辑时间: 2017年7月7日18:01:13 1.介绍 Atlassian Confluence(简称Confluence)是一个专业的wiki ...

  6. Java 10 的 10 个新特性,将彻底改变你写代码的方式!

    Java 9才发布几个月,很多玩意都没整明白,现在Java 10又快要来了.. 这时候我真尼玛想说:线上用的JDK 7 甚至JDK 6,JDK 8 还没用熟,JDK 9 才发布不久不知道啥玩意,JDK ...

  7. 以太坊挖矿源码:clique算法

    上文我们总结了以太坊最主要的共识算法:ethash算法,本文将重点分析以太坊的另一个共识算法:clique. 关键字:clique,共识算法,puppeth,以太坊地址原理,区块校验,认证结点,POA ...

  8. 【52ABP实战教程】00-- ASP.NET CORE系列介绍

    为什么是.net core? 记得在半年前.NET CORE刚刚出了1.0,当时有朋友推荐我使用的时候,个人觉得还不成熟. 现在.NET Core已经到了2.0,.NET Standard 2.0 添 ...

  9. JS笔记(一)

    第一章: 编写JS流程: 1.  布局:HTML和CSS 2.  样式:修改页面元素样式,div的display样式 3.  事件:确定用户做什么操作,onclick(鼠标点击事件).onmouseo ...

  10. Ajax.html:35 [Deprecation] Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org

    AJAX的容易错误的地方 Ajax.html:35 [Deprecation] Synchronous XMLHttpRequest on the main thread is deprecated ...