/**
题目:UVA11082 Matrix Decompressing
链接:https://vjudge.net/problem/UVA-11082
题意:lrj入门经典P374
已知一个矩阵的行数为r,列数为c,前i行的和ai(1<=i<=r),前j列的和bj(1<=j<=c)。
ai,bj都在[1,20]内。求出这个矩阵。 思路:通过前i行的和以及前j列的和,获得每一行的和以及每一列的和。 把每一行看做一个节点,每一列看做一个节点。
建立一个源点到达每一行。
建立一个汇点,每一列到达汇点。
每一行到达每一列。 由于数据范围是[1,20]。流可以说0.所以为了方便处理,所有容量-1.最后结果+1.
那么源点到第i行的容量为r[i]-列数。(每一行有列数个数)
第j列到汇点的容量为c[j]-行数。
第i行到第j列的容量都为19。(20-1) 每一行都经过每一列组成。所以这样建立连接。 如果源点到每一个行节点都是满载。
每一个列节点到汇点都是满载。
那么有解。 解为:
第i行第j列的元素为第i行的节点到第j列的节点的流+1。 */
#include<iostream>
#include<cstring>
#include<vector>
#include<map>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
const int INF = 0x3f3f3f3f;
typedef long long LL;
const int N = ;
int r[N], c[N];
struct Edge{
int from, to, cap, flow;
Edge(int u,int v,int c,int f):from(u),to(v),cap(c),flow(f){}
};
struct EdmondsKarp
{
int n, m;
vector<Edge> edges;
vector<int> G[N];
int p[N];
int a[N];
int ans[N][N]; void init(int n)
{
for(int i = ; i <= n; i++) G[i].clear();
edges.clear();
}
void AddEdge(int from,int to,int cap){
edges.push_back((Edge){from,to,cap,});
edges.push_back((Edge){to,from,,});
m = edges.size();
G[from].push_back(m-);
G[to].push_back(m-);
} int Maxflow(int s,int t)
{
int flow = ;
for(;;){
memset(a, , sizeof a);
queue<int>Q;
Q.push(s);
a[s] = INF;
while(!Q.empty()){
int x = Q.front(); Q.pop();
for(int i = ; i < G[x].size(); i++){
Edge& e = edges[G[x][i]];
if(!a[e.to]&&e.cap>e.flow){
p[e.to] = G[x][i];
a[e.to] = min(a[x],e.cap-e.flow);
Q.push(e.to);
}
}
if(a[t]) break;
}
if(!a[t]) break;
for(int u = t; u != s; u = edges[p[u]].from){
edges[p[u]].flow += a[t];
edges[p[u]^].flow -= a[t];
}
flow += a[t];
}
return flow;
} void getMatrix()
{
int r = , c = ;
for(int i = *(n+m); i < edges.size(); i+=){
if(c==m) {
r++, c = ;
}
ans[r][c] = edges[i].flow;
c++;
}
for(int i = ; i < n; i++){
for(int j = ; j < m; j++){
if(j==m-) printf("%d\n",ans[i][j]+);
else printf("%d ",ans[i][j]+);
}
}
}
}; int main()
{
int n, m, T;
scanf("%d",&T);
for(int cas = ; cas <= T; cas++){
scanf("%d%d",&n,&m);
for(int i = ; i < n; i++) scanf("%d",&r[i]);
for(int i = ; i < m; i++) scanf("%d",&c[i]);
for(int i = n-; i > ; i--) r[i] = r[i]-r[i-];
for(int i = m-; i > ; i--) c[i] = c[i]-c[i-];
int s, t;
s = , t = n+m+;
EdmondsKarp ek;
ek.init(t);
///s -> r
for(int i = ; i < n; i++) ek.AddEdge(s,i+,r[i]-m);
///c -> t
for(int i = ; i < m; i++) ek.AddEdge(n+i+,t,c[i]-n);
///r -> c
for(int i = ; i < n; i++){
for(int j = ; j < m; j++){
ek.AddEdge(i+,n+j+,);
}
}
int flow = ek.Maxflow(s,t);
printf("Matrix %d\n",cas);
ek.n = n, ek.m = m;
ek.getMatrix();
}
return ;
}

UVA11082 Matrix Decompressing 最大流建模解矩阵,经典的更多相关文章

  1. UVA-11082 Matrix Decompressing (网络流建模)

    题目大意:给出一个由1到20组成的整数矩阵的每一行和每一列的和,构造这个矩阵.输出任意一个构造方案. 题目分析:将每一行视作一个点x,将每一列视作一个点y.对于矩阵中的每一个格子,都对应一个二元关系& ...

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

    题目链接: Matrix Decompressing 题意: 给一个矩阵的每行和每列的和,(给的是前i行或者列的和); 矩阵中每个元素的值在1到20之间,找出这样的一个矩阵: 思路: 把它转化成一个二 ...

  3. UVa 11082 Matrix Decompressing(最大流)

    不想吐槽了..sample input 和sample output 完全对不上...调了一个晚上...不想说什么了... -------------------------------------- ...

  4. UVa11082 Matrix Decompressing(最小费用最大流)

    题目大概有一个n*m的矩阵,已知各行所有数的和的前缀和和各列所有数的和的前缀和,且矩阵各个数都在1到20的范围内,求该矩阵的一个可能的情况. POJ2396的弱化版本吧..建图的关键在于: 把行.列看 ...

  5. UVA - 11082 Matrix Decompressing(最大流+行列模型)

    题目大意:给出一个R行C列的矩阵,如今给出他的前1-R行和 && 前1-C列和,问这个矩阵原来是如何的,要求每一个元素大小在1-20之间 解题思路:将每一行连接到超级源点,容量为该行的 ...

  6. uva11082 Matrix Decompressing

    网络流 首先算出每行每列的数的和. 每行的值减去c,每列的值减去R 然后每行和每列之间连边,容量为19. 这样一来,(i,j)的流量相当于(i,j)的值-1. 这样就避免了流量为0不对应答案的尴尬情况 ...

  7. [题解]UVa 11082 Matrix Decompressing

    开始眨眼一看怎么也不像是网络流的一道题,再怎么看也觉得像是搜索.不过虽然这道题数据范围很小,但也不至于搜索也是可以随随便便就可以过的.(不过这道题应该是special judge,因为一题可以多解而且 ...

  8. uva Matrix Decompressing (行列模型)

    Matrix Decompressing 题目:    给出一个矩阵的前i行,前j列的和.要求你求出满足的矩阵. 矩阵的数范围在[1,20].   一開始就坑在了这里.没读细致题目. 囧...   事 ...

  9. UVa 11082 Matrix Decompressing - 网络流

    开始眨眼一看怎么也不像是网络流的一道题,再怎么看也觉得像是搜索.不过虽然这道题数据范围很小,但也不至于搜索也是可以随随便便就可以过的.(不过这道题应该是special judge,因为一题可以多解而且 ...

随机推荐

  1. sql字段字符用做其他类型查询

    select * FROM aa where parent = %@ ORDER BY cast(seq as integer) ASC

  2. VMware虚拟机中为Linux 添加虚拟硬盘(VirtualBox方法类似)

    修改1:2014-06-24 11:38:21 Linux添加硬盘是在原来安装的硬盘空间不够或者需要使用其他硬盘上的东西时候的解决办法,因为大多数初学者习惯使用虚拟机,这里以在Vmware虚拟机中实现 ...

  3. 简单抓取安居客房产数据,并保存到Oracle数据库

    思路和上一篇差不多,先获取网站html文件,使用BeautifulSoup进行解析,将对应属性取出,逐一处理,最后把整理出的记录保存到oracle中,持久化储存. '''Created on 2017 ...

  4. Android API level 版本对应关系

    详情地址:http://developer.android.com/guide/topics/manifest/uses-sdk-element.html Platform Version API L ...

  5. RMAN恢复 增加表空间后控制文件丢失

    查看目前的控制文件位置 SQL> select name from v$controlfile; NAME-------------------------------------------- ...

  6. iOS: iOS9 beta 请求出现App Transport Security has blocked a cleartext HTTP (http://)

    错误描述: App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecu ...

  7. oracle 10g函数大全--其他函数

    DUMP(w[,x[,y[,z]]]) [功能]返回数据类型.字节长度和在内部的存储位置. [参数] w为各种类型的字符串(如字符型.数值型.日期型……) x为返回位置用什么方式表达,可为:8,10, ...

  8. 【AS3 Coder】任务六:人物换装(纸娃娃)系统的制作

    使用框架:AS3(Flash Professional CS5.0及更高版本 + Flash Buider)任务描述:了解人物换装系统的制作原理难度系数:2 本章源码下载:http://www.iam ...

  9. [Python爬虫] 之二十三:Selenium +phantomjs 利用 pyquery抓取智能电视网数据

    一.介绍 本例子用Selenium +phantomjs爬取智能电视网(http://news.znds.com/article/news/)的资讯信息,输入给定关键字抓取资讯信息. 给定关键字:数字 ...

  10. Chrome 37 Beta: 使用Windows的DirectWrite和支持<dialog>元素

    今天的Chrome Beta 发布版包含了许多新的开发者特性.这些特性帮助你制作更丰富的.更迅速的和更引人入胜的网页内容以及应用程序,尤其是移动设备上.除非特别指出,否则下面描述的变化对Android ...