UVA 11082 矩阵解压(网络流建模)
矩阵解压
紫书P374 建模真的是挺难的,如果直接给我这题,我是想不到用网络流的,所以还应多做网路流建模,学会如何转化成网络流
还有,现在用的EK算法是比较慢的,还应去看看Dnic和ISAP,并且理解和应用
【题目链接】矩阵解压
【题目类型】网络流建模
&题解:
我先是看了紫书,懂了他的思路,感觉不算难,就自己写了一下。写完之后,哎我去,那EK写的惨不忍睹啊,静无限循环了,→_→ 接着,就照的刘汝佳的代码码了一遍,样例都过不去。= = 又找了半天的bug,发现push的边push错了,改完终于a了。 心累
&代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn=50+5;
const int INF=1000000000;
struct Edge{
int from,to,cap,flow;
};
struct EdmondsKarp{
vector<Edge> edges;
vector<int> G[maxn];
void Init(int n){
for(int i=0;i<n;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 m=edges.size();
G[from].push_back(m-2);
G[to].push_back(m-1);
}
int a[maxn];
int p[maxn];
int MaxFlow(int s,int t){
int flow=0;
for(;;){
memset(a,0,sizeof(a));
queue<int> Q;
Q.push(s);
a[s]=INF;
while(!Q.empty()){
int x=Q.front(); Q.pop();
for(int i=0;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]^1].flow-=a[t];
}
flow+=a[t];
}
return flow;
}
};
EdmondsKarp g;
int no[maxn][maxn];
int main(){
#ifndef ONLINE_JUDGE
freopen("1.in", "r", stdin);
freopen("1.out","w",stdout);
#endif
int T,R,C,v,kase=1;
scanf("%d",&T);
for(;kase<=T;kase++){
scanf("%d%d",&R,&C);
g.Init(R+C+2);
int last=0;
for(int i=1;i<=R;i++){
scanf("%d",&v);
g.AddEdge(0,i,v-last-C);
last=v;
}
last=0;
for(int i=1;i<=C;i++){
scanf("%d",&v);
g.AddEdge(R+i,R+C+1,v-last-R);
last=v;
}
for(int i=1;i<=R;i++)
for(int j=1;j<=C;j++){
g.AddEdge(i,R+j,19);
no[i][j]=g.edges.size()-2;
}
int re=g.MaxFlow(0,R+C+1);
// DG(g.edges.size())
// for(int i=0;i<38;i++){
// DGG(g.edges[i].cap,g.edges[i].flow)
// }
printf("Matrix %d\n", kase);
for(int i=1;i<=R;i++)
for(int j=1;j<=C;j++)
printf("%d%c",g.edges[no[i][j]].flow+1,j==C?'\n':' ');
printf("\n");
}
}
UVA 11082 矩阵解压(网络流建模)的更多相关文章
- [网络流最大流经典][uva 11082][矩阵解压]
题目大意 分析 #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring ...
- UVa 11082 Matrix Decompressing - 网络流
开始眨眼一看怎么也不像是网络流的一道题,再怎么看也觉得像是搜索.不过虽然这道题数据范围很小,但也不至于搜索也是可以随随便便就可以过的.(不过这道题应该是special judge,因为一题可以多解而且 ...
- UVa 11082 & 最大流的行列模型
题意: 给出一个矩阵前i行的和与前j列的和,(i∈[1,r],j属于[1,c]),每个元素ai,j∈[1,20],请你还原出这个矩阵,保证有解. SOL: 给网络流建模跪了,神一样的建图,如果我我会怎 ...
- UVA 10480 Sabotage (网络流,最大流,最小割)
UVA 10480 Sabotage (网络流,最大流,最小割) Description The regime of a small but wealthy dictatorship has been ...
- 培训补坑(day4:网络流建模与二分图匹配)
补坑时间到QAQ 好吧今天讲的是网络流建模与二分图匹配... day3的网络流建模好像说的差不多了.(囧) 那就接着补点吧.. 既然昨天讲了建图思想,那今天就讲讲网络流最重要的技巧:拆点. 拆点,顾名 ...
- UVa 11082 (网络流建模) Matrix Decompressing
网络流不难写,难的建一个能解决问题的模型.. 即使我知道这是网络流专题的题目,也绝不会能想出这种解法,=_=|| 题意: 给出一个矩阵的 前i行和 以及 前i列和,然后找到一个满足要求的矩阵,而且每个 ...
- UVA 11082 Matrix Decompressing 矩阵解压(最大流,经典)
题意: 知道矩阵的前i行之和,和前j列之和(任意i和j都可以).求这个矩阵.每个格子中的元素必须在1~20之间.矩阵大小上限20*20. 思路: 这么也想不到用网络流解决,这个模型很不错.假设这个矩阵 ...
- 紫书 例题11-8 UVa 11082(网络流最大流)
这道题的建模真的非常的秀, 非常牛逼. 先讲建模过程.源点到每一行连一条弧, 容量为这一行的和减去列数, 然后每一列到汇点连一条弧, 容量为这一列 的和减去行数, 然后每一行和列之间连一条弧, 容量为 ...
- 【网络流#5】UVA 11082 最大流
网络流题目最有意思的地方就是构图了,毕竟套模板每个人都会的 现在有一个矩阵,已知前i行元素之和a[i](1<=i<=n),前j列元素之和b[j](1<=j<=m),求一个可行的 ...
随机推荐
- html基本标签结构
简单的html5的基本架构 HTML全称为HyperText Markup Language,一款写给浏览器的语言. HyperText:超文本(文本,图片,视频,音频,链接) Markup Lanu ...
- Java设计模式系列3--抽象工厂模式(Abstract Factory Method)
2014-02-26 10:55:47 声明:本文不仅是本人自己的成果,有些东西取自网上各位大神的思想,虽不能一一列出,但在此一并感谢! 工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果 ...
- Centos上的安装openoffice+unoconv+swftools (转)
############################## # swftools的安装 # ############################## 1.安装所需的库和组件 yum ...
- JVM-并发-线程安全与锁优化
线程安全与锁优化 1.线程安全 (1)当多个线程访问一个对象时,如果不考虑这些线程在执行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获 ...
- java基础介绍(转)
很全面的介绍JAVA基础的文档 Java 编程简介,第 1 部分: Java 语言基础 http://www.ibm.com/developerworks/cn/java/j-introtojava1 ...
- Android Studio Reference local .aar files
repositories { flatDir { dirs 'libs' }} dependencies { compile 'com.android.support:support-v4:22.2. ...
- 期望DP
BZOJ 1415 #include <iostream> #include <cstring> #include <algorithm> #include < ...
- Linux线程-创建
Linux的线程实现是在内核以外来实现的,内核本身并不提供线程创建.但是内核为提供线程[也就是轻量级进程]提供了两个系统调用__clone()和fork (),这两个系统调用都为准备一些参数,最终都用 ...
- day11_API第一天
1.Eclipse常用操作 1:安装 A:解压 B:复制到指定的目录(不要有中文,和其他非法字符) 2:使用 A:打开软件的界面 B:新建一个项目(工程) C:在 ...
- JSP EL表达式 与输入有关的内置对象
与输入有关的隐含对象有两个param和paramValues,用来取得用户的请求参数.在使用EL之前可以使用如下代码取得用户的请求参数: request.getParameter(String nam ...