很经典的网络流模型,行编号和列编号分别看成一个点,行和列和分别看出容量,一个点(x,y)看出是一条边,边的容量下界是1,所以先减去1,之后在加上就好了。

建图的时候注意分配好编号,解从残留网络中的边找。

前向星建图的话,打印解会比较麻烦。

#include<bits/stdc++.h>
using namespace std; const int maxn = ; struct Edge
{
int v,cap,flow;
}; vector<Edge> edges;
#define PB push_back vector<int> G[maxn]; void AddEdge(int u,int v,int c)
{
G[u].PB(edges.size());
edges.PB(Edge{v,c,});
G[v].PB(edges.size());
edges.PB(Edge{u,,});
} const int INF = 0x3f3f3f3f;
int S,T;
int vcnt;
bool vis[maxn];
int d[maxn];
int q[maxn<<]; bool bfs()
{
memset(vis,,sizeof(bool)*vcnt);
int l = ,r = ;
q[r++] = S; vis[S] = true;
while(r>l){
int u = q[l++];
for(int i = ; i < G[u].size(); i++){
Edge &e = edges[G[u][i]];
if(!vis[e.v] && e.cap >e.flow){
vis[e.v] = true;
d[e.v] = d[u]+;
q[r++] = e.v;
}
}
}
return vis[T];
} int cur[maxn];
int dfs(int u,int a)
{
if(u == T||!a) return a;
int flow = , f;
for(int &i = cur[u]; i < G[u].size(); i++){
Edge &e = edges[G[u][i]];
if(d[e.v] == d[u]+ && (f = dfs(e.v,min(a,e.cap-e.flow)))>){
e.flow += f;
edges[G[u][i]^].flow -= f;
flow += f;
a -= f;
if(!a) break;
}
}
return flow;
} int MaxFlow()
{
int flow = ;
while(bfs()){
memset(cur,,sizeof(int)*vcnt);
flow += dfs(S,INF);
}
return flow;
} const int N = ;
int rid[N],cid[N]; void init()
{
vcnt = ;
edges.clear();
} int main()
{
//freopen("in.txt","r",stdin);
S = ; T = ;
int testCase; scanf("%d",&testCase);
int mcnt = ;
while(testCase--){
init();
int R,C,cap,pre; scanf("%d%d",&R,&C); for(int i = , M = R+C+; i < M; i++) G[i].clear();
pre = ;
for(int i = ; i < R; i++) {
rid[i] = vcnt++;
scanf("%d",&cap);
AddEdge(S,rid[i],cap-pre-C);
pre = cap;
}
pre = ;
for(int i = ; i < C; i++){
cid[i] = vcnt++;
scanf("%d",&cap);
AddEdge(cid[i],T,cap-pre-R);
pre = cap;
} for(int i = ; i < R; i++)
for(int j = ; j < C; j++){
AddEdge(rid[i],cid[j],);
} MaxFlow(); printf("Matrix %d\n",++mcnt);
for(int i = ; i < R; i++){
int k = , u = rid[i];
for(int j = ; j < G[u].size(); j++){
Edge &e = edges[G[u][j]];
if(e.v == cid[k]){
printf("%d%c",e.flow+,++k==C?'\n':' ');
if(k == C) break;
}
}
} if(testCase) putchar('\n');
}
return ;
}

UVA - 11082 Matrix Decompressing (最大流,技巧)的更多相关文章

  1. UVa 11082 Matrix Decompressing(最大流)

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

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

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

  3. UVA - 11082 Matrix Decompressing

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

  4. UVa 11082 - Matrix Decompressing(最大流)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

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

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

  6. uva 11082 Matrix Decompressing 【 最大流 】

    只看题目的话~~怎么也看不出来是网络流的题目的说啊~~~~ 建图好神奇~~ 最开始不懂---后来看了一下这篇-- http://www.cnblogs.com/AOQNRMGYXLMV/p/42807 ...

  7. [题解]UVa 11082 Matrix Decompressing

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

  8. UVa 11082 Matrix Decompressing - 网络流

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

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

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

随机推荐

  1. UVa-10954

    10954 - Add All Time limit: 3.000 seconds Yup!! The problem name reflects your task; just add a set ...

  2. STL中的vector实现邻接表

    /* STL中的vector实现邻接表 2014-4-2 08:28:45 */ #include <iostream> #include <vector> #include  ...

  3. 算法学习--Day5

    其实今天是第六天,不过昨天写的题目有些杂乱,都是贪心的算法,所以昨天的题目就不放上来了. 今天开始入手数据结构吧啦吧啦.. 数据结构当时学的时候感觉挺简单的,不过现在真正上代码之后发现情况并不妙,还是 ...

  4. HDU3415【单调队列】

    单调队列解决通过维护满足条件内的值,并保证队列里的值单调,解决一个最大最小. 让你求一个k区间长度的最大值,那么就只要搞下前缀和, sum[ i , j ] 区间的和:sum[ j ]-sum[ i ...

  5. HDU5918【KMP大法好,虽然我不会】

    #include <bits/stdc++.h> using namespace std; typedef long long LL; const; int n,m; int a[MAX] ...

  6. [Xcode 实际操作]九、实用进阶-(25)使用Storyboard(故事版)的约束功能,使项目快速适配各种分辨率的设备

    目录:[Swift]Xcode实际操作 本文将演示使用故事版的约束功能,使项目快速适配各种分辨率的设备. 在项目导航区打开并编辑主故事版[Main.storyboard]. 在当前故事版中,已经存在一 ...

  7. __setitem__,__getitem,__delitem__

    目录 __setitem__ __getitem__ __delitem__与__delattr__ class Foo: def __init__(self, name): self.name = ...

  8. 【BZOJ1174】: [Balkan2007]Toponyms

    →原题← ↑这样子我就不复制题面啦~ 就是一题很裸的字典树而已,不过空间卡的很死,直接开个数组 tr[N][52] 什么之类的一定会RE的(惨痛的教训) 当字典树空间不够而时间限制又比较宽松时,我们可 ...

  9. python自建模块显示说明与详情

    通常我们自建模块放在/usr/lib/python2.7/site-packages下面,这样可以python就可以进行调用. 但是,自建模块也要有详细的说明情况,例如查help,可以看出来模块的作用 ...

  10. github网页样式