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 (行列模型)的更多相关文章

  1. UVa 11082 & 最大流的行列模型

    题意: 给出一个矩阵前i行的和与前j列的和,(i∈[1,r],j属于[1,c]),每个元素ai,j∈[1,20],请你还原出这个矩阵,保证有解. SOL: 给网络流建模跪了,神一样的建图,如果我我会怎 ...

  2. UVa 11082 Matrix Decompressing(最大流)

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

  3. UVA - 11082 Matrix Decompressing

    2. B - Matrix Decompressing 题意:定义一个R*C的正整数矩阵(1<=R,C<=20),设Ai为前i行所有元素之和,Bi为前i列所有元素之和. 题目已知R,C和数 ...

  4. UVA11082 Matrix Decompressing 最大流建模解矩阵,经典

    /** 题目:UVA11082 Matrix Decompressing 链接:https://vjudge.net/problem/UVA-11082 题意:lrj入门经典P374 已知一个矩阵的行 ...

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

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

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

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

  7. [题解]UVa 11082 Matrix Decompressing

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

  8. UVa 11082 (网络流建模) Matrix Decompressing

    网络流不难写,难的建一个能解决问题的模型.. 即使我知道这是网络流专题的题目,也绝不会能想出这种解法,=_=|| 题意: 给出一个矩阵的 前i行和 以及 前i列和,然后找到一个满足要求的矩阵,而且每个 ...

  9. UVA 11082 Matrix Decompressing 矩阵解压(最大流,经典)

    题意: 知道矩阵的前i行之和,和前j列之和(任意i和j都可以).求这个矩阵.每个格子中的元素必须在1~20之间.矩阵大小上限20*20. 思路: 这么也想不到用网络流解决,这个模型很不错.假设这个矩阵 ...

随机推荐

  1. 以libevent网络库为引:网络通信和多线程

    1. windows下编译及使用libevent  http://www.cnblogs.com/luxiaoxun/p/3603399.html 2.  <<libevent学习资料&g ...

  2. HDOJ 2120 并查集

    并查集的应用,用来查找被分割的区域个数. 即当两个节点值相同时说明已经为了一个圈,否则不可能,此时区域个数加1. #include<iostream> #include<cstdio ...

  3. MYSQL中delete删除多表数据与删除关联数据

    在mysql中删除数据方法有很多种,最常用的是使用delete来删除记录,下面我来介绍delete删除单条记 录与删除多表关联数据的一些简单实例. 1.delete from t1 where 条件 ...

  4. mysql 结合keepalived测试

    vip:192.168.32.66 192.168.32.6 主库: mysql> show variables like '%read_only%'; +------------------+ ...

  5. fg、bg、jobs、&、nohup、ctrl + z命令

    fg.bg.jobs.&.nohup.ctrl + z命令 一.& 加在一个命令的最后,可以把这个命令放到后台执行,如gftp &, 二.ctrl + z 可以将一个正在前台执 ...

  6. bzoj 1020-1029

    1020 SHOI2008 安全的航线flight 这题的代码写了很久,主要是因为几何题的东西都忘得差不多了.除去写代码的2个小时,今晚又调了一晚上,终于AC了. 这题的做法还是很有参考价值的. 最简 ...

  7. grunt getHTML

    var Base = require( "../common/base" ) , HandlerBase = require( "../common/handlerBas ...

  8. 基于visual Studio2013解决面试题之1403插入排序

     题目

  9. AngularJS_百度百科

    AngularJS_百度百科     AngularJS    编辑     AngularJS是为克服HTML在构建应用上的不足而设计的.    目录         1简介引引        端对 ...

  10. Reader开发(二)增加PDF阅读功能

    最近任务很多很忙,所以更新博客的速度很慢. 大概上周就为Reader加了一个PDF阅读的功能,但是一直没时间写上来.昨晚找一下文件发现扩展了功能的Demo居然在文件目录下看不到任何文件,但是却显示有文 ...