Description

We are supposed to make a budget proposal for this multi-site competition. The budget proposal is a matrix where the rows represent different kinds of expenses and the columns represent different sites. We had a meeting about this, some time ago where we discussed the sums over different kinds of expenses and sums over different sites. There was also some talk about special constraints: someone mentioned that Computer Center would need at least 2000K Rials for food and someone from Sharif Authorities argued they wouldn't use more than 30000K Rials for T-shirts. Anyway, we are sure there was more; we will go and try to find some notes from that meeting.

And, by the way, no one really reads budget proposals anyway, so we'll just have to make sure that it sums up properly and meets all constraints.

Input

The first line of the input contains an integer N, giving the number of test cases. The next line is empty, then, test cases follow: The first line of each test case contains two integers, m and n, giving the number of rows and columns (m <= 200, n <= 20). The second line contains m integers, giving the row sums of the matrix. The third line contains n integers, giving the column sums of the matrix. The fourth line contains an integer c (c < 1000) giving the number of constraints. The next c lines contain the constraints. There is an empty line after each test case.

Each constraint consists of two integers r and q, specifying some entry (or entries) in the matrix (the upper left corner is 1 1 and 0 is interpreted as "ALL", i.e. 4 0 means all entries on the fourth row and 0 0 means the entire matrix), one element from the set {<, =, >} and one integer v, with the obvious interpretation. For instance, the constraint 1 2 > 5 means that the cell in the 1st row and 2nd column must have an entry strictly greater than 5, and the constraint 4 0 = 3 means that all elements in the fourth row should be equal to 3.

Output

For each case output a matrix of non-negative integers meeting the above constraints or the string "IMPOSSIBLE" if no legal solution exists. Put one empty line between matrices.

Sample Input

2

2 3
8 10
5 6 7
4
0 2 > 2
2 1 = 3
2 3 > 2
2 3 < 5 2 2
4 5
6 7
1
1 1 > 10

Sample Output

2 3 3
3 3 4 IMPOSSIBLE
 
【题意】

  有一个n*m的方阵,里面的数字未知,但是我们知道如下约束条件:

  每一行的数字的和

  每一列的数字的和

  某些格子有特殊的大小约束,用大于号,小于号和等于号表示

  问:是否存在用正数填充这个方阵的方案,满足所有的约束,若有,输出之,否则输出IMPOSSIBLE。

【分析】

  这题是有有源汇的上下界可行流,具体可看:http://blog.csdn.net/water_glass/article/details/6823741

  

求解一个有上下界的网络流的步骤:

1.首先进行构图,对于那么对流量没有限制的边,我们直接将容量赋值为原始的容量,而对于有流量要求的边,我们将容量减去下界并将其等价与无下界的边。最后就是添加一个附
加汇点和一个附加源点,从附加源点连向每个顶点的容量为以该点所有流入的下界流量总和,每个顶点流向附加汇点是该点流出的下界流量总和。

2.我们要添加一条从汇点到源点流量为INF的边,这条边的意义在于,能够使得源点会汇点满足成为流量平衡条件的普通节点。

(以下为有上下界的最小流求解步骤)
3.我们在以附加源点和附加汇点求一次最大流,如果所有的到附加汇点的边都满载,那么说明这个网络是存在满足所有下界的可行流的。因为去除了下界容量的图具备这个能力。但
 是此时的可行流(从汇点流向源点的流量)并不一定是最小流,因为满足情况的可行流是不唯一的。

4.紧接着,我们在原图上从汇点向源点求一次最大流(此时要删除掉那条从汇点到源点的INF的边),此时便是一个缩流的过程,旨在试探图中是否还存在流量去替代汇点到源点的流量。这里计算出来的结果可能比我们已得到的可行流还要大,意思是说从汇点到源点有的是空间,因此也就不必连接那条INF的边了,整个网络的流量可以为0,网络中存在环流。

由于这里免不了会进行删边的操作,因此我们直接找到那条边,把流量赋值为0就可以了。

上述来自:http://www.cnblogs.com/proverbs/archive/2013/01/05/2846910.html

  对于循环流上的某一条边x->y,下界为k1,上界为k2,我们这样变形,变成一个只有上界的网络流(下界默认为0),即普通的网络流,满流时有解。

  对于原图源汇的,我们在原图汇点连向原图源点一条流量为INF的边,形成循环流即可。

  关于此题建模:类似二分图,每行建一个点,每列建一个点,源点连行,流量为这行的和,列连汇点,流量为这列的和。

  行连向列的流量表示这行这列这个点的值。

  根据题目中的约束求出边的上下界,跑一遍即可。

代码如下:

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#define INF 0xfffffff
#define Maxn 210
#define Maxm 30 int lim[][Maxn][Maxm]; struct node
{
int x,y,next,f,o;
}t[Maxn*Maxm*];int len; int first[Maxn*Maxn+],dis[Maxn*Maxm+];
int st,ed,fst,fed,n,m,sum;
bool ok; int mymax(int x,int y) {return x>y?x:y;}
int mymin(int x,int y) {return x<y?x:y;} void ins(int x,int y,int f)
{
if(f==) return;
if(x==fst) sum+=f;
t[++len].x=x;t[len].y=y;t[len].f=f;
t[len].next=first[x];first[x]=len;t[len].o=len+;
t[++len].x=y;t[len].y=x;t[len].f=;
t[len].next=first[y];first[y]=len;t[len].o=len-;
} void get_e(int x,int y,int l1,int l2)
{
if(l2<l1) {ok=;return;}
ins(fst,y,l1);ins(x,fed,l1);ins(x,y,l2-l1);
} void init()
{
scanf("%d%d",&n,&m);
memset(first,,sizeof(first));
len=;
st=n+m+;ed=st+;fst=ed+,fed=fst+;
ok=;sum=;
for(int i=;i<=n;i++)
{
int x;
scanf("%d",&x);
get_e(st,i,x,x);
}
for(int i=;i<=m;i++)
{
int x;
scanf("%d",&x);
get_e(i+n,ed,x,x);
}
int q;
scanf("%d",&q);
char s[];
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
lim[][i][j]=;lim[][i][j]=INF;
}
while(q--)
{
int x,y,z;
scanf("%d%d%s%d",&x,&y,s,&z);
int k1,k2,k3,k4;
if(x==) k1=,k2=n;
else k1=k2=x;
if(y==) k3=,k4=m;
else k3=k4=y;
for(int i=k1;i<=k2;i++)
for(int j=k3;j<=k4;j++)
{
if(s[]=='>') lim[][i][j]=mymax(lim[][i][j],z+);
if(s[]=='=') lim[][i][j]=mymax(lim[][i][j],z);
if(s[]=='<') lim[][i][j]=mymin(lim[][i][j],z-);
if(s[]=='=') lim[][i][j]=mymin(lim[][i][j],z);
}
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
get_e(i,j+n,lim[][i][j],lim[][i][j]);
if(ok==) break;
}
get_e(ed,st,,INF);
} queue<int > q;
bool bfs()
{
while(!q.empty()) q.pop();
memset(dis,-,sizeof(dis));
q.push(fst);dis[fst]=;
while(!q.empty())
{
int x=q.front();q.pop();
for(int i=first[x];i;i=t[i].next) if(t[i].f>)
{
if(dis[t[i].y]==-)
{
dis[t[i].y]=dis[x]+;
q.push(t[i].y);
}
}
}
if(dis[fed]==-) return ;
return ;
} int ffind(int x,int low)
{
if(x==fed) return low;
int now=;
for(int i=first[x];i;i=t[i].next) if(t[i].f>)
{
int y=t[i].y;
if(now==low) break;
if(dis[y]==dis[x]+)
{
int a=mymin(t[i].f,low-now);
a=ffind(t[i].y,a);
t[i].f-=a;
t[t[i].o].f+=a;
now+=a;
}
}
if(now==) dis[x]=-;
return now;
} int pri[Maxn][Maxm];
void dinic()
{
int ans=;
while(bfs())
{
ans+=ffind(fst,INF);
}
memset(pri,,sizeof(pri));
if(ans==sum)
{
for(int i=;i<=len;i+=)
{
if(t[i].x>n&&t[i].x<=n+m&&t[i].y<=n+m)
{
pri[t[i].y][t[i].x-n]=t[i].f;
}
}
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
printf("%d ",pri[i][j]+lim[][i][j]);
printf("\n");
}
}
else printf("IMPOSSIBLE\n");
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
init();
if(ok==) {printf("IMPOSSIBLE\n\n");continue;}
dinic();printf("\n");
}
return ;
}

[POJ2396]

2016-05-19 17:01:02

 

【POJ2396】Budget(上下界网络流)的更多相关文章

  1. poj2396 Budget 上下界可行流

    Budget:http://poj.org/problem?id=2396 题意: 给定一个棋盘,给定每一行每一列的和,还有每个点的性质.求一个合理的棋盘数值放置方式. 思路: 比较经典的网络流模型, ...

  2. POJ 2396 Budget (上下界网络流有源可行流)

    转载: http://blog.csdn.net/axuan_k/article/details/47297395 题目描述: 现在要针对多赛区竞赛制定一个预算,该预算是一个行代表不同种类支出.列代表 ...

  3. POJ 2396 Budget(有源汇上下界网络流)

    Description We are supposed to make a budget proposal for this multi-site competition. The budget pr ...

  4. hdu 4940 Destroy Transportation system( 无源汇上下界网络流的可行流推断 )

    题意:有n个点和m条有向边构成的网络.每条边有两个花费: d:毁坏这条边的花费 b:重建一条双向边的花费 寻找这样两个点集,使得点集s到点集t满足 毁坏全部S到T的路径的费用和 > 毁坏全部T到 ...

  5. ACM-ICPC 2018 沈阳赛区网络预赛 F Fantastic Graph(贪心或有源汇上下界网络流)

    https://nanti.jisuanke.com/t/31447 题意 一个二分图,左边N个点,右边M个点,中间K条边,问你是否可以删掉边使得所有点的度数在[L,R]之间 分析 最大流不太会.. ...

  6. 算法笔记--最大流和最小割 && 最小费用最大流 && 上下界网络流

    最大流: 给定指定的一个有向图,其中有两个特殊的点源S(Sources)和汇T(Sinks),每条边有指定的容量(Capacity),求满足条件的从S到T的最大流(MaxFlow). 最小割: 割是网 ...

  7. HDU 4940 Destroy Transportation system(无源汇上下界网络流)

    Problem Description Tom is a commander, his task is destroying his enemy’s transportation system. Le ...

  8. ACM-ICPC 2018 沈阳赛区网络预赛 F. Fantastic Graph (贪心或有源汇上下界网络流)

    "Oh, There is a bipartite graph.""Make it Fantastic."X wants to check whether a ...

  9. [BZOJ2502]清理雪道 有上下界网络流(最小流)

    2502: 清理雪道 Time Limit: 10 Sec  Memory Limit: 128 MB Description        滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场 ...

  10. uoj132/BZOJ4200/洛谷P2304 [Noi2015]小园丁与老司机 【dp + 带上下界网络流】

    题目链接 uoj132 题解 真是一道大码题,,,肝了一个上午 老司机的部分是一个\(dp\),观察点是按\(y\)分层的,而且按每层点的上限来看可以使用\(O(nd)\)的\(dp\),其中\(d\ ...

随机推荐

  1. 实现FTP断点续传

    应用需求: 网盘开发工作逐步进入各部分的整合阶段,当用户在客户端修改或新增加一个文件时,该文件要同步上传到服务器端对应的用户目录下,因此针对数据传输(即:上传.下载)这一块现在既定了三种传输方式,即: ...

  2. 5 Ways to Use Log Data to Analyze System Performance--reference

    Recently we looked across some of the most common behaviors that our community of 25,000 users looke ...

  3. (转)Java Ant build.xml详解

    1,什么是ant ant是构建工具2,什么是构建概念到处可查到,形象来说,你要把代码从某个地方拿来,编译,再拷贝到某个地方去等等操作,当然不仅与此,但是主要用来干这个3,ant的好处跨平台   --因 ...

  4. Android低功耗蓝牙(BLE)开发的一点感受

    最近一段时间,因为产品的需要我做了一个基于低功耗蓝牙设备的Android应用,其中碰到了一些困难,使我深深体会到Android开发的难处:不同品牌,不同型号和不同版本之间的差异使得Android应用适 ...

  5. PHP四种传参方式

    test1界面: <html> <head> <title>testPHP</title> <meta http-equiv = "co ...

  6. [FTP] FTPClient--FTP操作帮助类,上传下载,文件,目录操作 (转载)

    点击下载 FTPClient.zip 这个类是关于FTP客户端的操作1.构造函数 2.字段 服务器账户密码3.属性4.链接5.传输模式6.文件操作7.上传和下载8.目录操作9.内容函数看下面代码吧 / ...

  7. [功能帮助类] 最新的Functions 类 (转载)

    代码 using System; using System.Collections.Generic; using System.Text; using System.Security.Cryptogr ...

  8. 读取Properties配置文件

    一,Android中 在Android中读取配置文件,可以使用System.getProperties()方法读取: 1,在res资源目录下,新建一个文件夹 raw,然后在其下创建一个.propert ...

  9. 计算从A地出发到各个地方的路径及距离

    数据库环境:SQL SERVER 2005 如题,现有bus表数据如下,dstart是起点,dend是终点,distance是两地的距离.

  10. jQuery 杂项方法

    jQuery 杂项方法 方法 描述 data() 向被选元素附加数据,或者从被选元素获取数据 each() 为每个匹配元素执行函数 get() 获取由选择器指定的 DOM 元素 index() 从匹配 ...