有源汇上下界可行流(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 ...
随机推荐
- JVM笔记7-内存分配与回收策略
1.对象优先在Eden分配 大多数情况下,对象在新生代Eden区中分配.当Eden区中没有足够空间分配时,虚拟机将发起一次Minor GC.虚拟机提供了-XX:PrintGCDetails 这个收集器 ...
- 十、Python练习----基础搭建飞机大战
只是简单的学习了pygame,实现飞机的摧毁还需要多张图片的切换,和sprite(碰撞精灵),还有多种音效的添加(如背景音乐.摧毁特效).以后再深入学习我只是练习一下python. 一.搭建界面(基于 ...
- 第三篇:Python字符编码
一 .了解字符编码的知识储备 1计算机基础知识 1.2文本编辑器存取文件的原理(nodepat++,Pycharm,word) #.打开编辑器就打开了启动了一个进程,是在内存中的,所以,用编辑器编写的 ...
- OpenShift实战(一):OpenShift高级安装
1.1 服务器基本信息 本次安装采用一个master.5个node.3个etcd,node节点两块硬盘,60G磁盘用于docker storage,xxx改为自己的域名或主机名. 节点 功能 IP 内 ...
- 初学深度学习(TensorFlow框架的心得and经验总结)自用环境的总结
初学者的时间大部分浪费在了环境上了: 建议直接上Linux系统,我推荐国产的深度系统,deepin这几年一直在不断的发展,现在15.4已经很不错了 1,图形化界面很漂亮,内置正版crossover,并 ...
- Mego开发文档 - 数据属性生成值
数据属性生成值 该功能用于在数据插入或更新时为指定属性生成期望的值,Mego提供了非常灵活的实现方式以满足各种数据提交时的自动赋值问题. 生成值目的及模式 在Mego中生成值的目的一定是插入数据或更新 ...
- J2ee入门:servlet-mapping的映射配置
<servlet-mapping>元素在Servlet和URL样式之间定义一个映射.它包含了两个子元素<servlet- name>和<url-pattern> & ...
- JS解析JSON字符串
问题描述:后台需要传递给前台一些数据,用于页面数据显示,因为是一些Lable标签,所以数据传递到前台需要解析. 思路:因为数据比较杂乱,所以我选择传递的数据类型是Json格式,但是数据展示时需要解析成 ...
- Python基础(函数-递归)
本章内容: 深浅拷贝 函数(全局与局部变量) 内置函数 文件处理 三元运算 lambda 表达式 递归(斐波那契数列) 冒泡排序 深浅拷贝 一.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝 ...
- zoj 3950 how many nines
https://vjudge.net/problem/ZOJ-3950 题意: 给出两个日期,计算从第一个日期开始到第二个日期,每一天的日期中的9加起来一共有多少个. 思路: 看题解补的题.首先看这题 ...