UVA - 11082 Matrix Decompressing (最大流,技巧)
很经典的网络流模型,行编号和列编号分别看成一个点,行和列和分别看出容量,一个点(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 (最大流,技巧)的更多相关文章
- UVa 11082 Matrix Decompressing(最大流)
不想吐槽了..sample input 和sample output 完全对不上...调了一个晚上...不想说什么了... -------------------------------------- ...
- UVA - 11082 Matrix Decompressing(最大流+行列模型)
题目大意:给出一个R行C列的矩阵,如今给出他的前1-R行和 && 前1-C列和,问这个矩阵原来是如何的,要求每一个元素大小在1-20之间 解题思路:将每一行连接到超级源点,容量为该行的 ...
- UVA - 11082 Matrix Decompressing
2. B - Matrix Decompressing 题意:定义一个R*C的正整数矩阵(1<=R,C<=20),设Ai为前i行所有元素之和,Bi为前i列所有元素之和. 题目已知R,C和数 ...
- UVa 11082 - Matrix Decompressing(最大流)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 11082 Matrix Decompressing 矩阵解压(最大流,经典)
题意: 知道矩阵的前i行之和,和前j列之和(任意i和j都可以).求这个矩阵.每个格子中的元素必须在1~20之间.矩阵大小上限20*20. 思路: 这么也想不到用网络流解决,这个模型很不错.假设这个矩阵 ...
- uva 11082 Matrix Decompressing 【 最大流 】
只看题目的话~~怎么也看不出来是网络流的题目的说啊~~~~ 建图好神奇~~ 最开始不懂---后来看了一下这篇-- http://www.cnblogs.com/AOQNRMGYXLMV/p/42807 ...
- [题解]UVa 11082 Matrix Decompressing
开始眨眼一看怎么也不像是网络流的一道题,再怎么看也觉得像是搜索.不过虽然这道题数据范围很小,但也不至于搜索也是可以随随便便就可以过的.(不过这道题应该是special judge,因为一题可以多解而且 ...
- UVa 11082 Matrix Decompressing - 网络流
开始眨眼一看怎么也不像是网络流的一道题,再怎么看也觉得像是搜索.不过虽然这道题数据范围很小,但也不至于搜索也是可以随随便便就可以过的.(不过这道题应该是special judge,因为一题可以多解而且 ...
- UVA11082 Matrix Decompressing 最大流建模解矩阵,经典
/** 题目:UVA11082 Matrix Decompressing 链接:https://vjudge.net/problem/UVA-11082 题意:lrj入门经典P374 已知一个矩阵的行 ...
随机推荐
- 【Linux学习】Vi / Vim编辑器—编辑器工作模式、vi编辑操作
Vi / Vim编辑器-编辑器工作模式.vi编辑操作 推荐一个很好的学习指南:http://www.oschina.net/translate/learn-vim-progressively 一.编辑 ...
- 技术胖Flutter第四季-22页面跳转并返回数据
视频地址: https://www.bilibili.com/video/av35800108/?p=23 博客地址: https://jspang.com/post/flutter4.html#to ...
- 技术胖Flutter第四季-24Flutter的打包
视频地址: https://www.bilibili.com/video/av35800108/?p=25 文章地址: https://jspang.com/post/flutter4.html#to ...
- 爬虫代码实现六-Queue队列实现循环抓取
StartDSJCount : package com.dajiangtai.djt_spider.start; import java.util.List;import java.util.Queu ...
- 4.2 手写Java PriorityQueue 核心源码 - 实现篇
上一节介绍了PriorityQueue的原理,先来简单的回顾一下 PriorityQueue 的原理 以最大堆为例来介绍 PriorityQueue是用一棵完全二叉树实现的. 不但是棵完全二叉树,而且 ...
- uoj#275. 【清华集训2016】组合数问题(数位dp)
传送门 假设有\(k|{n\choose m}\),因为\(n!\)中质因子\(k\)的次数为\(S(n)=\left\lfloor\frac{n}{k}\right\rfloor+\left\lfl ...
- 异常定义-Mybatis中的源码参考
public class IbatisException extends RuntimeException { private static final long serialVersionUID = ...
- STP-3-收敛到新的STP拓扑
事实上,即使拓扑已经稳定,STP也从未停止工作,对每个收到的BPDU,交换机都会重新计算自己对于根桥,RP,DP的选择.在稳定的拓扑中,交换机收到的BPDU不变,因此对这些BPDU的处理会一遍一遍产生 ...
- OSPF-1-OSPF的数据库交换(2)
2.Hello过程: (1)在同一子网中发现其他运行OSPF的路由器 所有启用了OSPF的接口,都会监听发往224.0.0.5的组播Hello消息,这是表示所有OSPF路由器的组播地址.Hello包使 ...
- [题解](数学)BZOJ_1257_余数求和
来源:https://blog.csdn.net/loi_dqs/article/details/50522975 并不知道为什么是sqrt(n)的段数......书上写的看不懂...... 但是这个 ...