网络流题目最有意思的地方就是构图了,毕竟套模板每个人都会的

现在有一个矩阵,已知前i行元素之和a[i](1<=i<=n),前j列元素之和b[j](1<=j<=m),求一个可行的矩阵,且矩阵每个元素在区间[1,20]内。

这也算是含上下界的网络流了,但是显然,如果将每个元素都减一,就是普通的最大流了,矩阵元素值在区间[0,19]内。

首先求出第i行元素之和r[i],第j列元素之和c[j],

然后就是建图,每行化为一个结点1~n,每列化为一个结点n+1~n+m

源点到1~n,分别连一条边,容量为r[i]-m

n+1~n+m到汇点,分别连一条边,容量为c[i]-n

1~n到n+1~n+m,分别连一条容量为19的边

这样跑一发网络流

 #include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<set>
#include<map>
#include<stack>
#include<vector>
#include<queue>
#include<string>
#include<sstream>
#define MAXN 1000
#define MAXM 2000
#define INF (1<<30)
#define eps 0.000001
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
using namespace std;
const int inf = 0x3f3f3f3f;
int i,j,k,n,m,x,y,T,num,w,cas,s,t,maxflow,u;
struct edgenode
{
int from,to,next;
int cap;
}edge[MAXM];
int Edge,head[MAXN],ps[MAXN],dep[MAXN],r[MAXN],c[MAXN],tt;
int ans[MAXN][MAXN]; void add_edge(int x,int y,int c)
{
edge[Edge].from=x;
edge[Edge].to=y;
edge[Edge].cap=c;
edge[Edge].next=head[x];
head[x]=Edge++; edge[Edge].from=y;
edge[Edge].to=x;
edge[Edge].cap=;
edge[Edge].next=head[y];
head[y]=Edge++;
}
/*关于这个模板:
Edge为前向星的边数,所以需要初始化Edge和head数组
n表示有n个点,这个版无所谓点从0开始还是从1开始,s表示源点,t表示汇点
很好的一个是,这个版的DFS使用的是模拟栈,防止爆栈
*/ int dinic(int n,int s,int t)
{
int tr,res=;
int i,j,k,l,r,top;
while(){
memset(dep,-,(n+)*sizeof(int));
for(l=dep[ps[]=s]=,r=;l!=r;)//BFS部分,将给定图分层
{
for(i=ps[l++],j=head[i];j!=-;j=edge[j].next)
{
if (edge[j].cap&&-==dep[k=edge[j].to])
{
dep[k]=dep[i]+;ps[r++]=k;
if(k==t)
{
l=r;
break;
}
}
}
}
if(dep[t]==-)break; for(i=s,top=;;)//DFS部分
{
if(i==t)//当前点就是汇点时
{
for(k=,tr=inf;k<top;++k)
if(edge[ps[k]].cap<tr)tr=edge[ps[l=k]].cap; for(k=;k<top;++k)
edge[ps[k]].cap-=tr,edge[ps[k]^].cap+=tr; res+=tr;
i=edge[ps[top=l]].from;
} for(j=head[i];j!=-;j=edge[j].next)//找当前点所指向的点
if(edge[j].cap&&dep[i]+==dep[edge[j].to]) break; if(j!=-)
{
ps[top++]=j;//当前点有所指向的点,把这个点加入栈中
i=edge[j].to;
}
else
{
if (!top) break;//当前点没有指向的点,回溯
dep[i]=-;
i=edge[ps[--top]].from;
}
}
}
return res;
} int main()
{
scanf("%d",&T);
for (cas=;cas<=T;cas++)
{
memset(head,-,sizeof(head));
Edge=; scanf("%d%d",&n,&m);
int pre=;
for (i=;i<=n;i++)
{
scanf("%d",&r[i]);
add_edge(,i,r[i]-m-pre);
pre=r[i];
}
tt=n+m+;
pre=;
for (i=;i<=m;i++)
{
scanf("%d",&c[i]);
add_edge(i+n,tt,c[i]-n-pre);
pre=c[i];
}
for (i=;i<=n;i++)
{
for (j=;j<=m;j++)
{
add_edge(i,n+j,);
}
} maxflow=dinic(tt+,,tt);
//cout<<maxflow<<endl;
for (i=;i<=n;i++)
{
for (j=head[i];j!=-;j=edge[j].next)
{
u=edge[j].to;
if (u<=n||u>n+m) continue;
ans[i][u-n]=-edge[j].cap;
}
}
printf("Matrix %d\n",cas);
for (i=;i<=n;i++)
{
for (j=;j<m;j++)
{
printf("%d ",ans[i][j]+);
}
printf("%d\n",ans[i][m]+);
}
if (cas!=T) printf("\n");
}
return ;
}

【网络流#5】UVA 11082 最大流的更多相关文章

  1. UVa 11082 & 最大流的行列模型

    题意: 给出一个矩阵前i行的和与前j列的和,(i∈[1,r],j属于[1,c]),每个元素ai,j∈[1,20],请你还原出这个矩阵,保证有解. SOL: 给网络流建模跪了,神一样的建图,如果我我会怎 ...

  2. 紫书 例题11-8 UVa 11082(网络流最大流)

    这道题的建模真的非常的秀, 非常牛逼. 先讲建模过程.源点到每一行连一条弧, 容量为这一行的和减去列数, 然后每一列到汇点连一条弧, 容量为这一列 的和减去行数, 然后每一行和列之间连一条弧, 容量为 ...

  3. Libre 6013 「网络流 24 题」负载平衡 (网络流,最小费用最大流)

    Libre 6013 「网络流 24 题」负载平衡 (网络流,最小费用最大流) Description G 公司有n 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使n ...

  4. Libre 6011 「网络流 24 题」运输问题 (网络流,最小费用最大流)

    Libre 6011 「网络流 24 题」运输问题 (网络流,最小费用最大流) Description W 公司有m个仓库和n个零售商店.第i个仓库有\(a_i\)个单位的货物:第j个零售商店需要\( ...

  5. Libre 6010「网络流 24 题」数字梯形 (网络流,最大费用最大流)

    Libre 6010「网络流 24 题」数字梯形 (网络流,最大费用最大流) Description 给定一个由n 行数字组成的数字梯形如下图所示.梯形的第一行有m 个数字.从梯形的顶部的m 个数字开 ...

  6. Libre 6008 「网络流 24 题」餐巾计划 (网络流,最小费用最大流)

    Libre 6008 「网络流 24 题」餐巾计划 (网络流,最小费用最大流) Description 一个餐厅在相继的N天里,第i天需要Ri块餐巾(i=l,2,-,N).餐厅可以从三种途径获得餐巾. ...

  7. POJ 2135 Farm Tour (网络流,最小费用最大流)

    POJ 2135 Farm Tour (网络流,最小费用最大流) Description When FJ's friends visit him on the farm, he likes to sh ...

  8. 【uva 11082】Matrix Decompressing(图论--网络流最大流 Dinic+拆点二分图匹配)

    题意:有一个N行M列的正整数矩阵,输入N个前1~N行所有元素之和,以及M个前1~M列所有元素之和.要求找一个满足这些条件,并且矩阵中的元素都是1~20之间的正整数的矩阵.输入保证有解,而且1≤N,M≤ ...

  9. [网络流最大流经典][uva 11082][矩阵解压]

    题目大意 分析 #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring ...

随机推荐

  1. JavaScript 框架比较

    显著增强 JavaScript 开发的框架概览 Joe Lennon, 软件开发人员, 自由职业者 简介: 现代 Web 站点和 Web 应用程序倾向于依赖大量客户端 JavaScript 来提供丰富 ...

  2. InstallShield安装包中集成第三方安装包的方案选择[转]

      我们在制作安装包时,有些情况下会涉及第三方安装的集成,这里将讨论如何调用安装第三方包,以及需要注意的事项. 第三方安装包的介质类型有很多,主要有:单独的一个Setup.exe,单独的一个msi包, ...

  3. [javascript]String添加trim和reverse方法

    function trim() { var start, end; start = 0; end = this.length - 1; while(start <= end && ...

  4. jquery-object.js

    /** * jQuery.query - Query String Modification and Creation for jQuery * Written by Blair Mitchelmor ...

  5. native2ascii 在 Mac终端的转码

    打开终端,输入 native2ascii 回车   然后输入想要转码的 中文   回车   自动会出现  通用的  unicode编码. 默认应该是 utf-8 格式

  6. 创建局域网内远程git仓库,并将本地仓库push推到远程仓库中

    转载请注明出处 http://www.goteny.com/articles/2014/06/136.html http://www.cnblogs.com/zjjne/p/3778640.html ...

  7. Sample RWD Setup for Client-Side Development

    RWD and RESS concepts fluid images, responsive grids, and media queries. Twitter's Bootstrap based o ...

  8. 不通用版(从SVN取版本,通过MAVEN生成JAVA包,通过SALTSTACK传送到远程服务器并自动重启TOMCAT服务)PYTHON代码

    从昨晚写到今天啊, 第一版测试成功了. PHP和JAVA的更新相对来说,PHP的自动化更新是简单多啦~~ 当然,这只是运维工作当中的一环~~ #!/usr/bin/env python # -*- c ...

  9. Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x0

    如果遇到这个问题,首先考虑以下原因: 你是否在setText()方法中设置了一个int型变量,比如setText(10). 这样Android系统就会主动去资源文件当中寻找, 但是它不是一个资源文件I ...

  10. Perl时间处理函数

    官方网址:http://search.cpan.org/~stbey/Date-Calc-6.3/lib/Date/Calc.pod#___top use Date::Calc qw( Days_in ...