/**
题目: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. jQuery的deferred对象详解(转)

    jQuery的开发速度很快,几乎每半年一个大版本,每两个月一个小版本. 每个版本都会引入一些新功能.今天我想介绍的,就是从jQuery 1.5.0版本开始引入的一个新功能----deferred对象. ...

  2. 文件描述符与socket连接

    每个进程开启一个soeket连接,都会占用一个文件描述符.   1. 概述       在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件.链接文件和设备文件.       文件 ...

  3. java对象详解

    java对象及线程详解 内存布局 普通对象布局 数组的内存布局 内部类的内存布局 对象分解 对象头-mark word(8字节) 实例数据 对齐填充(可选) java锁分析 volatile关键字 v ...

  4. 【java】处理时间字段 在数据库查询的时候只想要年月日,不想要时分秒 ,java中设置时间类型为年月日,java中设置Date中的时分秒为00.00.000

    JDK8 中最简单的处理方式: @Test public void dateTest(){ Date now = new Date(); System.out.println(now); // jav ...

  5. CSS3 animation动画

    CSS3 animation动画 1.@keyframes 定义关键帧动画2.animation-name 动画名称3.animation-duration 动画时间4.animation-timin ...

  6. C语言中的union使用方法

    union共用声明和共用一变量定义: "联合"是一种特殊的类,也是一种构造类型的数据结构.在一个"联合"内能够定义多种不同的数据类型. 一个被说明为该" ...

  7. Unity3D使用TCP/IP协议,传递protocol buffer消息protobuf-net

    原文:http://my.oschina.net/faint/blog/296785 第一部分 dll 1 下面大多数内容,都是使用c#编译的dll来实现的. 2 编译为dll后,要拖放到unity3 ...

  8. JavaScript——中的prototype(原型)

    JS中的prototype是JS中比较难理解的一个部分 本文基于下面几个知识点: 1 原型法设计模式 在.Net中可以使用clone()来实现原型法 原型法的主要思想是,现在有1个类A,我想要创建一个 ...

  9. 访问vector元素方法的效率比较(转)

    LInux下: gcc 4.47,red hat6 #include<iostream> #include<vector> #include<time.h> usi ...

  10. Gperftools中tcmalloc的简介和使用(转)

    TcMalloc(Thread-CachingMalloc)是google-perftools工具中的一个内存管理库,与标准的glibc库中malloc相比,TcMalloc在内存分配的效率和速度上要 ...