【网络流#5】UVA 11082 最大流
网络流题目最有意思的地方就是构图了,毕竟套模板每个人都会的
现在有一个矩阵,已知前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 最大流的更多相关文章
- UVa 11082 & 最大流的行列模型
题意: 给出一个矩阵前i行的和与前j列的和,(i∈[1,r],j属于[1,c]),每个元素ai,j∈[1,20],请你还原出这个矩阵,保证有解. SOL: 给网络流建模跪了,神一样的建图,如果我我会怎 ...
- 紫书 例题11-8 UVa 11082(网络流最大流)
这道题的建模真的非常的秀, 非常牛逼. 先讲建模过程.源点到每一行连一条弧, 容量为这一行的和减去列数, 然后每一列到汇点连一条弧, 容量为这一列 的和减去行数, 然后每一行和列之间连一条弧, 容量为 ...
- Libre 6013 「网络流 24 题」负载平衡 (网络流,最小费用最大流)
Libre 6013 「网络流 24 题」负载平衡 (网络流,最小费用最大流) Description G 公司有n 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使n ...
- Libre 6011 「网络流 24 题」运输问题 (网络流,最小费用最大流)
Libre 6011 「网络流 24 题」运输问题 (网络流,最小费用最大流) Description W 公司有m个仓库和n个零售商店.第i个仓库有\(a_i\)个单位的货物:第j个零售商店需要\( ...
- Libre 6010「网络流 24 题」数字梯形 (网络流,最大费用最大流)
Libre 6010「网络流 24 题」数字梯形 (网络流,最大费用最大流) Description 给定一个由n 行数字组成的数字梯形如下图所示.梯形的第一行有m 个数字.从梯形的顶部的m 个数字开 ...
- Libre 6008 「网络流 24 题」餐巾计划 (网络流,最小费用最大流)
Libre 6008 「网络流 24 题」餐巾计划 (网络流,最小费用最大流) Description 一个餐厅在相继的N天里,第i天需要Ri块餐巾(i=l,2,-,N).餐厅可以从三种途径获得餐巾. ...
- POJ 2135 Farm Tour (网络流,最小费用最大流)
POJ 2135 Farm Tour (网络流,最小费用最大流) Description When FJ's friends visit him on the farm, he likes to sh ...
- 【uva 11082】Matrix Decompressing(图论--网络流最大流 Dinic+拆点二分图匹配)
题意:有一个N行M列的正整数矩阵,输入N个前1~N行所有元素之和,以及M个前1~M列所有元素之和.要求找一个满足这些条件,并且矩阵中的元素都是1~20之间的正整数的矩阵.输入保证有解,而且1≤N,M≤ ...
- [网络流最大流经典][uva 11082][矩阵解压]
题目大意 分析 #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring ...
随机推荐
- PHP json的插入和解析在数据库中的操作
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. PHP中往数据库中存储json数据在项目开发中也经常遇到,下面我就 ...
- Linux硬盘命名和安装分区
硬盘命名: 硬盘命名基于文件,一般有如下文件方式: /dev/hda1 /dev/sdb3 具体含义如下: /dev:是所有设备文件存放的目录. hd和sd:他们是区别的前两个字母,代表该分区所在的设 ...
- C# 中使用 OpenSSL 的公钥/私钥进行加密和解密
在C#中进行RSA解密,需要用RSACryptoServiceProvider,但是不支持OpenSSL格式的公钥或者私钥. X509 公钥 -----BEGIN PUBLIC KEY----- MI ...
- a标签无disabled属性
<a class="button">确认</a> 我们经常会用a标签来设置按钮样式,如果点击它跳转页面,那么没有任何问题. 如果绑定了ajax事件,即点击后 ...
- listen函数
listen函数仅仅由TCP服务器调用,它做2件事: 1)当socket函数创建一个套接字时,它被假设为一个主动套接字,也就是说,它是一个将调用connect发起连接的客户套接字 listen函数把一 ...
- iOS6 自动布局 入门–Auto Layout(转)
iOS6 自动布局 入门–Auto Layout(转) 标签: 杂谈 目前为止,即使你的界面设计是在合理的复杂度内,你也必须要为之写许多代码来适应变化的布局.现在我相信你会很高兴听到这种情况将不会 ...
- 怎样导入SDWebImage
Two ways : 方法1:copy all the files into your project. --下载https://github.com/rs/SDWebImage. --把SD项目co ...
- 【Git】Git远程操作详解
Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能. Git有很多优势,其中之一就是远程操作非常简便.本文详细介绍5个Git命令,它们的概念和用法,理解了这些内容,你就会完全掌握Gi ...
- Android添加桌面快捷方式的简单实现
核心代码如下: Button bn = (Button) findViewById(R.id.bn); // 为按钮的单击事件添加监听器 bn.setOnClickListener(new OnCli ...
- COJN 0483 800501求最大非空子矩阵
800501求最大非空子矩阵 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩 ...