【UVA11082】Matrix Decompressing(有上下界的网络流)

题意:给出一个矩阵前i列所有元素的和,和前j行所有元素的和,求这个矩阵解压以后的原型。(答案不唯一)

n,m<=20,1<=a[i,j]<=20

思路:这道题把边上的流量作为原先矩阵中的点

把每一行,每一列都看成一个点

S——>i行 a[i]-m

i行——>j列 19

j列——>T b[i]-n

跑最大流,边(i,j+n)上的流量就是a[i,j]的值

为什么容量是a[i]-m,19,b[i]-n?

因为点权(边权)不能为0,所以要先把所有值+1,上限就-1,输出的时候+1即可

  1 var fan:array[1..200000]of longint;
  2     head,vet,next,len,gap,dis,a,b,c1,c2:array[0..50000]of longint;
  3     num:array[1..30,1..30]of longint;
  4     n,m,i,j,tot,s,source,src,cas,v:longint;
  5
  6 procedure add(a,b,c:longint);
  7 begin
  8  inc(tot);
  9  next[tot]:=head[a];
 10  vet[tot]:=b;
 11  len[tot]:=c;
 12  head[a]:=tot;
 13
 14  inc(tot);
 15  next[tot]:=head[b];
 16  vet[tot]:=a;
 17  len[tot]:=0;
 18  head[b]:=tot;
 19 end;
 20
 21 function min(x,y:longint):longint;
 22 begin
 23  if x<y then exit(x);
 24  exit(y);
 25 end;
 26
 27 function dfs(u,aug:longint):longint;
 28 var e,v,t,flow,val:longint;
 29 begin
 30  if u=src then exit(aug);
 31  e:=head[u]; flow:=0; val:=s-1;
 32  while e<>0 do
 33  begin
 34   v:=vet[e];
 35   if len[e]>0 then
 36   begin
 37    if dis[u]=dis[v]+1 then
 38    begin
 39     t:=dfs(v,min(len[e],aug-flow));
 40     len[e]:=len[e]-t;
 41     len[fan[e]]:=len[fan[e]]+t;
 42     flow:=flow+t;
 43     if dis[source]>=s then exit(flow);
 44     if aug=flow then break;
 45    end;
 46    val:=min(val,dis[v]);
 47   end;
 48   e:=next[e];
 49  end;
 50  if flow=0 then
 51  begin
 52   dec(gap[dis[u]]);
 53   if gap[dis[u]]=0 then dis[source]:=s;
 54   dis[u]:=val+1;
 55   inc(gap[dis[u]]);
 56  end;
 57  exit(flow);
 58 end;
 59
 60 function maxflow:longint;
 61 var ans:longint;
 62 begin
 63  fillchar(gap,sizeof(gap),0);
 64  fillchar(dis,sizeof(dis),0);
 65  gap[0]:=s; ans:=0;
 66  while dis[source]<s do ans:=ans+dfs(source,maxlongint);
 67  exit(ans);
 68 end;
 69
 70 begin
 71  assign(input,‘UVA11082.in‘); reset(input);
 72  assign(output,‘UVA11082.out‘); rewrite(output);
 73  for i:=1 to 200000 do
 74   if i mod 2=1 then fan[i]:=i+1
 75    else fan[i]:=i-1;
 76  readln(cas);
 77  for v:=1 to cas do
 78  begin
 79   fillchar(head,sizeof(head),0); tot:=0;
 80   fillchar(num,sizeof(num),0);
 81   fillchar(len,sizeof(len),0);
 82   readln(n,m);
 83   for i:=1 to n do
 84   begin
 85    read(a[i]); c1[i]:=a[i]-a[i-1];
 86   end;
 87   for i:=1 to m do
 88   begin
 89    read(b[i]); c2[i]:=b[i]-b[i-1];
 90   end;
 91   s:=n+m+2; source:=n+m+1; src:=n+m+2;
 92   for i:=1 to n do add(source,i,c1[i]-m);
 93   for i:=1 to m do add(i+n,src,c2[i]-n);
 94   for i:=1 to n do
 95    for j:=1 to m do
 96    begin
 97     num[i,j]:=tot+2;
 98     add(i,j+n,19);
 99    end;
100   maxflow;
101   writeln(‘Matrix ‘,v);
102   for i:=1 to n do
103   begin
104    for j:=1 to m-1 do write(len[num[i,j]]+1,‘ ‘);
105    write(len[num[i,m]]+1);
106    writeln;
107   end;
108   if v<>cas then writeln;
109  end;
110
111  close(input);
112  close(output);
113 end.
时间: 2024-08-25 01:36:16

【UVA11082】Matrix Decompressing(有上下界的网络流)的相关文章

UVA-11082 Matrix Decompressing(有上下界的最大流)

题目链接: Matrix Decompressing 题意: 给一个矩阵的每行和每列的和,(给的是前i行或者列的和); 矩阵中每个元素的值在1到20之间,找出这样的一个矩阵: 思路: 把它转化成一个二分图,每行和每列之间连一条弧,然后设置一个源点和一个汇点,源点与行点相连,汇点与列点相连,求一个最大值,当然这是一个有下界的最大流,需要做-1的处理,同时与源汇相连的边也是要处理的;最后求得的反向边+1就是答案了; AC代码: #include <bits/stdc++.h> /*#include

BZOJ 2406 二分+有上下界的网络流判定

思路: 求出每行的和  sum_row 每列的和   sum_line 二分最后的答案mid S->i  流量[sum_row[i]-mid,sum_row[i]+mid] i->n+j 流量[L,R] n+j->T 流量 [sum_line[i]-mid,sum_line[i]+mid] 套用有上下界的网络流 判一下就好了.. 这是道有上下界网络流的裸题 //By SiriusRen #include <queue> #include <cstdio> #inc

有上下界的网络流2-有源汇带上下界网络流ZOJ3229

ZOJ3229题目大意:一个屌丝给m个女神拍照,计划拍照n天,每一天屌丝可以和C个女神拍照,每天拍照数不能超过D张,而且给每个女神i拍照有数量限制[Li,Ri],对于每个女神n天的拍照总和不能少于Gi,如果有解求屌丝最多能拍多少张照,并求每天给对应女神拍多少张照:否则输出-1. 解题思路:        1.增设一源点st,汇点sd,st到第i天连一条上界为Di下界为0的边,每个女神到汇点连一条下界为Gi上界为正无穷的边,对于每一天,当天到第i个女孩连一条[Li,Ri]的边.        2.

有上下界的网络流1-无源汇带上下界网络流SGU194

今天开始啃网络流了.对于求解无源汇带上下界的网络流,我们可以这样建图:建图模型:         以前写的最大流默认的下界为0,而这里的下界却不为0,所以我们要进行再构造让每条边的下界为0,这样做是为了方便处理.对于每根管子有一个上界容量up和一个下界容量low,我们让这根管子的容量下界变为0,上界为up-low.可是这样做了的话流量就不守恒了,为了再次满足流量守恒,即每个节点"入流=出流",我们增设一个超级源点st和一个超级终点sd.我们开设一个数组du[]来记录每个节点的流量情况.

poj_2396 有上下界的网络流

题目大意 一个mxn的矩阵,给出矩阵中每一行的和sh[1,2...m]以及每一列的数字的和目sv[1,2...n],以及矩阵中的一些元素的范围限制,比如a[1][2] > 1, a[2][3] < 4, a[3][3] = 10等等,且要求矩阵中的每个元素值非负.求出,是否存在满足所有给出的限制条件的矩阵,若存在输出. 题目分析 这么多限制条件..开始只能想到暴力解法+剪枝.这他妈得需要多大的脑洞才能无中生有的想到网络流解法? 不过,给出网络流的想法之后发现采用网络流解法确实很合理,很简单(唯

ZOJ 2314 Reactor Cooling 带上下界的网络流

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1314 题意: 给n个点,及m根pipe,每根pipe用来流躺液体的,单向的,每时每刻每根pipe流进来的物质要等于流出去的物质,要使得m条pipe组成一个循环体,里面流躺物质. 并且满足每根pipe一定的流量限制,范围为[Li,Ri].即要满足每时刻流进来的不能超过Ri(最大流问题),同时最小不能低于Li. 求的是最大流. 很久之前就看了带上下界的网络流,一直没看懂

【网络流补全计划】Part.Ⅲ有上下界的网络流

本来心情就非常糟糕调月下毛景树把我最后一点写代码的心情调没了 放弃 开始补全网络流. 之前学了普通最大流,那么现在开始补有上下界的网络流. 在普通最大流中,网络里的每一条边都只有流量的上界即边的容量,而引入上下界网络流之后,每个边不但有一个容量,还有一个流量下界. 我们令B(u,v)表示边(u,v)的下界.于是我们可以有表达式: B(u,v)≤f(u,v)≤C(u,v) 有这个式子可以得到 0≤f(u,v)≤C(u,v)?B(u,v) 至此,我们可以将有上下界的网络流分为几种问题来对待,接下来就

SGU 194. Reactor Cooling(无源汇有上下界的网络流)

时间限制:0.5s 空间限制:6M 题意: 显然就是求一个无源汇有上下界的网络流的可行流的问题 Solution: 没什么好说的,直接判定可行流,输出就好了 code /* 无汇源有上下界的网络流 */ #include <iostream> #include <cstring> #define ms(a,b) memset(a,b,sizeof a) using namespace std; const int MAXN = 209; struct node { int u, v

ZOJ 2314 有上下界的网络流

点击打开链接 题意:给定m条边和n个节点,每条边最少的流量和最多的流量,保证每个节点的出入流量和相等,问可以形成吗,可以则输出每条边的流量 思路:一道有上下界的网络流,因为有下界,说明我们每条边必须跑大于等于下界的流量,那我们可以转化一下,将下界设为必要边,也就是我们肯定会跑的边,而且这道题是没有源点和汇点的,所以我们要加这两个点,而对于一条边,a,b,low,high,我们a->b连的流量为high-low,a->T为low,S->b为low,跑最大流,如果满流则方案成功,找边的流量输

关于流量有上下界的网络流问题的求解

之前涉及到的网络流问题,每条弧的容量下限都是0,上限都是C.而在流量有上下界的网络流问题中,每条弧有一个流量下界low,还有一个上界up. 对于这样的问题,一般都三类: 1.没有源点和汇点的有上下界的网络最大流问题 2.有源点和汇点的有上下界的网络最大流问题 3.有源点和汇点的有上下界的网络最小流问题 第一类问题: (没有源点和汇点的有上下界的网络最大流问题) [1]我们需要构造一个伴随网络,首先建立一个附加源点SS和一个附加汇点TT: [2]对于原网络中的每一个顶点Vi,在伴随网络中加一条新的