UVA11082 Matrix Decompressing 最大流建模解矩阵,经典
/**
题目: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 最大流建模解矩阵,经典的更多相关文章
- UVA-11082 Matrix Decompressing (网络流建模)
题目大意:给出一个由1到20组成的整数矩阵的每一行和每一列的和,构造这个矩阵.输出任意一个构造方案. 题目分析:将每一行视作一个点x,将每一列视作一个点y.对于矩阵中的每一个格子,都对应一个二元关系& ...
- UVA-11082 Matrix Decompressing(有上下界的最大流)
题目链接: Matrix Decompressing 题意: 给一个矩阵的每行和每列的和,(给的是前i行或者列的和); 矩阵中每个元素的值在1到20之间,找出这样的一个矩阵: 思路: 把它转化成一个二 ...
- UVa 11082 Matrix Decompressing(最大流)
不想吐槽了..sample input 和sample output 完全对不上...调了一个晚上...不想说什么了... -------------------------------------- ...
- UVa11082 Matrix Decompressing(最小费用最大流)
题目大概有一个n*m的矩阵,已知各行所有数的和的前缀和和各列所有数的和的前缀和,且矩阵各个数都在1到20的范围内,求该矩阵的一个可能的情况. POJ2396的弱化版本吧..建图的关键在于: 把行.列看 ...
- UVA - 11082 Matrix Decompressing(最大流+行列模型)
题目大意:给出一个R行C列的矩阵,如今给出他的前1-R行和 && 前1-C列和,问这个矩阵原来是如何的,要求每一个元素大小在1-20之间 解题思路:将每一行连接到超级源点,容量为该行的 ...
- uva11082 Matrix Decompressing
网络流 首先算出每行每列的数的和. 每行的值减去c,每列的值减去R 然后每行和每列之间连边,容量为19. 这样一来,(i,j)的流量相当于(i,j)的值-1. 这样就避免了流量为0不对应答案的尴尬情况 ...
- [题解]UVa 11082 Matrix Decompressing
开始眨眼一看怎么也不像是网络流的一道题,再怎么看也觉得像是搜索.不过虽然这道题数据范围很小,但也不至于搜索也是可以随随便便就可以过的.(不过这道题应该是special judge,因为一题可以多解而且 ...
- uva Matrix Decompressing (行列模型)
Matrix Decompressing 题目: 给出一个矩阵的前i行,前j列的和.要求你求出满足的矩阵. 矩阵的数范围在[1,20]. 一開始就坑在了这里.没读细致题目. 囧... 事 ...
- UVa 11082 Matrix Decompressing - 网络流
开始眨眼一看怎么也不像是网络流的一道题,再怎么看也觉得像是搜索.不过虽然这道题数据范围很小,但也不至于搜索也是可以随随便便就可以过的.(不过这道题应该是special judge,因为一题可以多解而且 ...
随机推荐
- 在Delphi中使用键盘勾子获取键盘输入(译--5月7日)
http://blog.sina.com.cn/s/blog_502b2e970100949s.html 获取键盘输入以控制无法接受输入焦点的控件考虑一些游戏,显示图片在TPainBox,但是TPai ...
- zk删除node模式
检查状态 状态描述指定的znode的元数据.它包含时间戳,版本号,ACL,数据长度和子znode等细项. 语法 stat /path 示例 stat /FirstZnode 输出 [zk: local ...
- ORACLE查看并修改最大连接数的具体步骤
第一步,在cmd命令行,输入sqlplus 第二步,根据提示输入用户名与密码 1. 查看processes和sessions参数 SQL> show parameter processes ...
- cocos2dx -lua 面向对象-转
转自:http://www.himigame.com/lua-game/1282.html 上一篇中,向童鞋们介绍了如何自定义类binding到Lua中供给使用的教程,那么本篇将介绍利用OOP思想在在 ...
- javascript快速入门22--Ajax简介
Ajax是什么? 首先,Ajax是什么?一个很酷的新兴词汇!仅仅是某种早就有了的技术的一种新说法而已! Ajax是指一种创建交互式网页应用的网页开发技术.要谈到网页应用程序,则必须从WEB的历史来讲: ...
- 使用unity3d开发app
做过一些项目,参入过一些项目的计划安排.总觉得一些工具用起来很麻烦,要么是要收费,要么很大很重.没有针对小团队的简单易用的任务管理工具,也可能是找了些不能适合自己的习惯. 所有准备开始自己开发一款项目 ...
- 2017.11.15 linux软件安装管理(todo)
学习来自:http://www.imooc.com/learn/447 第一章 介绍 第二章 软件包简介 1.源码包 2.二进制包(RPM包或系统默认包) 脚本安装包其实是别人把软件安装的脚本写好了, ...
- 使用pip安装tensorflow 0.80,python 使用tensorflow 0.80遇到的问题及处理方法
http://blog.csdn.net/levy_cui/article/details/51251095 1.python 版本切换到2.7 推荐使用pythonbrew,http://blog. ...
- nav标签使用说明
一.html nav标签语法与结构 - TOP 1.基本语法 <nav>内容</nav> 2.nav加id <nav id=”abc”>内容</nav ...
- 手机SD卡损坏补救措施
现在的应用程序越来越重,比如微信.来往之类的,稍微用一段时间,就会占用几十MB甚至上百MB的空间.而有时候甚至手机会出现"无响应"的现象,需要你选择"继续等待" ...