题意:给出一个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. 关于collectionView和tableView的两种cell的出列方法的区别

    相信好多人一定会对collectionView和tableView的两种cell出列方法有所疑问,下面以UICollection为例子进行举例说明 假设我们已经创建了一个collectionView, ...

  2. JAVA_SE基础——30.构造代码块

    黑马程序员入学blog...构造代码块作用:给所有的对象进行统一的初始化. 问题:要求每个小孩出生都会哭,这份代码有两个构造函数,如果需要每个小孩出生都要哭的话,那么就需要在不同的构造函数中都调用cr ...

  3. Python之旅_计算机基础入门

    一.计算机基础 1.Python是编程语言 语言:一种事物与另一种事物沟通的介质. 编程语言:程序员与计算机沟通的介质. 什么是编程:程序员用编程语言把自己的逻辑思想下来,编程的结果就是一堆文件. 为 ...

  4. js常用API方法

    String对象常用的API:API指应用程序编程接口,实际上就是一些提前预设好的方法. charAt() 方法可返回指定位置的字符. stringObject.charAt(index) index ...

  5. 一张图说明 Web Api 参数绑定默认规则

    请求如下: 控制器如下: 慎重说明:不管请求方式是 get 还是 post , 简单类型的参数,如 name 和 id ,其值都是从 url 里面去取. Web API 从 url 还是 body 获 ...

  6. OpenShift实战(三):OpenShift持久化存储Redis

    1.模板定义 修改OpenShift自带模板 [root@master1 pv]# oc edit template redis-persistent 添加如下: 2.创建PV 编辑redis pv ...

  7. gogs详细配置

    sudo apt-get update sudo apt-get upgrade sudo adduser git //创建用户  密码 ******* su git//切换到git用户 cd ~   ...

  8. 新概念英语(1-101)A Card From Jimmy

    Lesson 101 A card from Jimmy 吉米的明信片 Listen to the tape then answer this question. Does Grandmother s ...

  9. Docker学习笔记 - Docker容器的日志

    docker logs  [-f]  [-t]  [--tail]  容器名 -f -t --tail="all" 无参数:返回所有日志 -f 一直跟踪变化并返回 -t 带时间戳返 ...

  10. J2ee入门:servlet-mapping的映射配置

    <servlet-mapping>元素在Servlet和URL样式之间定义一个映射.它包含了两个子元素<servlet- name>和<url-pattern> & ...