uva Matrix Decompressing (行列模型)
Matrix Decompressing
题目:
给出一个矩阵的前i行,前j列的和。要求你求出满足的矩阵。
矩阵的数范围在[1,20]。
一開始就坑在了这里。没读细致题目。
囧。。。
事实上这题的模型就是一个网络流的行列模型,跟poj的那题budge一样建图。只是Poj 的那个建图输入麻烦。而这题是裸的,由于已经告诉你了下界为1,上界为20,囧。。。并且poj那题我至今也不知道为什么我会一直超时。
T_T
算法:
行列模型能够转换成网络流的有源汇上下界网络流求解。而行号和列号分别作为顶点。
连结超级源汇点就ok了。跑两边最大流,而每条边上的流量+下界流就是结果了。
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std; const int INF = 1 << 20;
const int MAXN = 400 + 10;
struct Edge{
int from,to,cap,flow;
Edge(){};
Edge(int _from,int _to,int _cap,int _flow)
:from(_from),to(_to),cap(_cap),flow(_flow){};
};
vector<Edge> edges;
vector<int> G[MAXN];
int cur[MAXN],d[MAXN];
int N,M,src,sink,ss,tt; ////////////////////////////////////// int ans[MAXN][MAXN]; void init(){
ss = N + M + 2; tt = ss + 1;
src = tt + 1; sink = src + 1;
for(int i = 0;i <= sink + 1;++i)
G[i].clear();
edges.clear();
} void addEdge(int from,int to,int cap){
edges.push_back(Edge(from,to,cap,0));
edges.push_back(Edge(to,from,0,0));
int sz = edges.size();
G[from].push_back(sz - 2);
G[to].push_back(sz - 1);
} bool BFS(){
fill(d,d + sink + 2,-1);
queue<int> Q;
Q.push(src);
d[src] = 0; while(!Q.empty()){
int x = Q.front(); Q.pop();
for(int i = 0;i < (int)G[x].size();++i){
Edge& e = edges[G[x][i]];
if(d[e.to] == -1 && e.cap > e.flow){
d[e.to] = d[x] + 1;
Q.push(e.to);
}
}
} return d[sink] > 0;
} int DFS(int x,int a){
if(x == sink || a == 0)
return a; int flow = 0,f;
for(int& i = cur[x];i < (int)G[x].size();++i){
Edge& e = edges[G[x][i]];
if(d[e.to] == d[x] + 1 && (f = DFS(e.to,min(a,e.cap - e.flow))) > 0){
e.flow += f;
edges[G[x][i]^1].flow -= f;
flow += f;
a -= f;
if(a == 0) break;
}
}
return flow;
} int maxflow(){
int flow = 0;
while(BFS()){
memset(cur,0,sizeof(cur));
flow += DFS(src,INF);
}
return flow;
} int main()
{
// freopen("Input.txt","r",stdin); int T;
scanf("%d",&T);
for(int kase = 1;kase <= T;++kase){
scanf("%d%d",&N,&M); init(); int sum = 0,x;
for(int i = 1;i <= N;++i){
scanf("%d",&x);
addEdge(ss,i,x - sum);
sum = x;
} sum = 0;
for(int i = 1;i <= M;++i){
scanf("%d",&x);
addEdge(i+N,tt,x - sum);
sum = x;
} for(int i = 1;i <= N;++i){
for(int j = 1;j <= M;++j){
addEdge(i,sink,1);
addEdge(i,N + j,19);
addEdge(src,N + j,1);
}
} addEdge(tt,ss,INF); int flow = maxflow(); src = ss; sink = tt; maxflow();
printf("Matrix %d\n",kase); for(int i = 1;i <= N;++i){
for(int j = 0;j < (int)G[i].size();++j){
Edge& e = edges[G[i][j]];
if(e.from > N||e.to <= N||e.to > N+M) continue;
ans[e.from][e.to - N] = e.flow + 1;
}
} for(int i = 1;i <= N;++i){
for(int j = 1;j <= M;++j)
printf("%d%c",ans[i][j],j == M ? '\n':' ');
}
}
return 0;
}
uva Matrix Decompressing (行列模型)的更多相关文章
- UVa 11082 & 最大流的行列模型
题意: 给出一个矩阵前i行的和与前j列的和,(i∈[1,r],j属于[1,c]),每个元素ai,j∈[1,20],请你还原出这个矩阵,保证有解. SOL: 给网络流建模跪了,神一样的建图,如果我我会怎 ...
- UVa 11082 Matrix Decompressing(最大流)
不想吐槽了..sample input 和sample output 完全对不上...调了一个晚上...不想说什么了... -------------------------------------- ...
- UVA - 11082 Matrix Decompressing
2. B - Matrix Decompressing 题意:定义一个R*C的正整数矩阵(1<=R,C<=20),设Ai为前i行所有元素之和,Bi为前i列所有元素之和. 题目已知R,C和数 ...
- UVA11082 Matrix Decompressing 最大流建模解矩阵,经典
/** 题目:UVA11082 Matrix Decompressing 链接:https://vjudge.net/problem/UVA-11082 题意:lrj入门经典P374 已知一个矩阵的行 ...
- UVA-11082 Matrix Decompressing(有上下界的最大流)
题目链接: Matrix Decompressing 题意: 给一个矩阵的每行和每列的和,(给的是前i行或者列的和); 矩阵中每个元素的值在1到20之间,找出这样的一个矩阵: 思路: 把它转化成一个二 ...
- UVA - 11082 Matrix Decompressing(最大流+行列模型)
题目大意:给出一个R行C列的矩阵,如今给出他的前1-R行和 && 前1-C列和,问这个矩阵原来是如何的,要求每一个元素大小在1-20之间 解题思路:将每一行连接到超级源点,容量为该行的 ...
- [题解]UVa 11082 Matrix Decompressing
开始眨眼一看怎么也不像是网络流的一道题,再怎么看也觉得像是搜索.不过虽然这道题数据范围很小,但也不至于搜索也是可以随随便便就可以过的.(不过这道题应该是special judge,因为一题可以多解而且 ...
- UVa 11082 (网络流建模) Matrix Decompressing
网络流不难写,难的建一个能解决问题的模型.. 即使我知道这是网络流专题的题目,也绝不会能想出这种解法,=_=|| 题意: 给出一个矩阵的 前i行和 以及 前i列和,然后找到一个满足要求的矩阵,而且每个 ...
- UVA 11082 Matrix Decompressing 矩阵解压(最大流,经典)
题意: 知道矩阵的前i行之和,和前j列之和(任意i和j都可以).求这个矩阵.每个格子中的元素必须在1~20之间.矩阵大小上限20*20. 思路: 这么也想不到用网络流解决,这个模型很不错.假设这个矩阵 ...
随机推荐
- Datagridview列绑定数据
属性最下面的Column项: 把每一列的字段绑定,更改显示的标题. 数据绑定代码: string sql = "select IncomeExpendTypeID , TypeName , ...
- WinForm 小程序 NotePad
运行效果: 代码: using System; using System.Collections.Generic; using System.ComponentModel; using System. ...
- SAX方式解析XML
sax解析分为以下几步: 1 获取一个saxparserfactory 2 获取一个解析器 3 创建handler对象,这个myHandler是继承了DefaultHandler的一个类,这个实现类里 ...
- nginx提示:500 Internal Server Error错误的解决方法
现在越来越多的站点开始用 Nginx ,("engine x") 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 ...
- Qt新建线程的方法(有QRunnable,QThreadPool,moveToThread和QtConcurrent的例子)
看了不少Qt线程的东西,下面总结一下Qt新建一个线程的方法. 一.继承QThread 继承QThread,这应该是最常用的方法了.我们可以通过重写虚函数void QThread::run ()实现我们 ...
- Jquery moblie中的分栏布局
大家好,很高兴又与大家见面了,今天我要给大家展示的是自己对jquery moblie中网格布局的理解.可能不是尽善尽美,希望大家多多体谅! 在jquery moblie中有两种布局,一种是表格布局( ...
- C++ map排序(按照value值排序)_glp_hit_新浪博客
C++ map排序(按照value值排序)_glp_hit_新浪博客 C++ map排序(按照value值排序) (2012-07-12 14:19:51) 转载▼ 标签: ...
- shapefile 编码错误问题解决 Wrong codepage of shapefile Warning 1: One or several characters couldn't be converted correctly from UTF-8 to ISO-8859-1.
linux下运行,因为大部分shapefile 文件,在使用时都没有指定字符集,所以qgis只能从环境变量中获取设置环境变量中获取SHAPE_ENCODING. 目前唯一的解决办法就是设置环境变量 $ ...
- hdu1172猜数字
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1172 题目 猜数字 Time Limit: 20000/10000 MS (Java/Others) ...
- Swift - 表格图片加载优化(拖动表格时不加载,停止时只加载当前页图片)
列表的单元格中包含有图片在开发中很常见.通常我们可以直接在tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIn ...