紫书 例题11-8 UVa 11082(网络流最大流)
#include<cstdio>
#include<vector>
#include<queue>
#include<algorithm>
#include<cstring>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;
const int MAXN = 112;
struct Edge
{
int from, to, cap, flow;
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 h[MAXN], cur[MAXN], id[MAXN][MAXN], n, m, s, t;
void AddEdge(int from, int to, int cap)
{
edges.push_back(Edge(from, to, cap, 0));
edges.push_back(Edge(to, from, 0, 0));
g[from].push_back(edges.size() - 2);
g[to].push_back(edges.size() - 1);
}
bool bfs()
{
memset(h, 0, sizeof(h));
queue<int> q;
q.push(s);
h[s] = 1;
while(!q.empty())
{
int u = q.front(); q.pop();
REP(i, 0, g[u].size())
{
Edge& e = edges[g[u][i]];
if(!h[e.to] && e.cap > e.flow)
{
h[e.to] = h[u] + 1;
q.push(e.to);
}
}
}
return h[t];
}
int dfs(int x, int a)
{
if(x == t || a == 0) return a;
int flow = 0, f;
for(int& i = cur[x]; i < g[x].size(); i++)
{
Edge& e = edges[g[x][i]];
if(h[x] + 1 == h[e.to] && (f = dfs(e.to, min(a, e.cap - e.flow))) > 0)
{
e.flow += f;
edges[g[x][i] ^ 1].flow -= f;
flow += f;
if((a -= f) == 0) break;
}
}
return flow;
}
int solve()
{
int ret = 0;
while(bfs()) memset(cur, 0, sizeof(cur)), ret += dfs(s, 1e9);
return ret;
}
int main()
{
int T;
scanf("%d", &T);
REP(kase, 1, T + 1)
{
scanf("%d%d", &n, &m);
REP(i, 0, m + n + 2) g[i].clear();
edges.clear();
s = n + m, t = n + m + 1;
int last = 0;
REP(i, 0, n)
{
int x;
scanf("%d", &x);
AddEdge(s, i, x - last - m);
last = x;
}
last = 0;
REP(i, 0, m)
{
int x;
scanf("%d", &x);
AddEdge(n + i, t, x - last - n);
last = x;
}
REP(i, 0, n)
REP(j, 0, m)
{
AddEdge(i, n + j, 19);
id[i][j] = edges.size() - 2;
}
solve();
printf("Matrix %d\n", kase);
REP(i, 0, n)
{
REP(j, 0, m)
printf("%d ", edges[id[i][j]].flow + 1);
puts("");
}
puts("");
}
return 0;
}
紫书 例题11-8 UVa 11082(网络流最大流)的更多相关文章
- 紫书 例题 11-13 UVa 10735(混合图的欧拉回路)(最大流)
这道题写了两个多小时-- 首先讲一下怎么建模 我们的目的是让所有点的出度等于入度 那么我们可以把点分为两部分, 一部分出度大于入度, 一部分入度大于出度 那么显然, 按照书里的思路,将边方向后,就相当 ...
- 紫书 例题8-3 UVa 1152(中途相遇法)
这道题要逆向思维, 就是求出答案的一部分, 然后反过去去寻找答案存不存在. 其实很多其他题都用了这道题目的方法, 自己以前都没有发现, 这道题专门考这个方法.这个方法可以没有一直往下求, 可以省去很多 ...
- 紫书 例题8-12 UVa 12627 (找规律 + 递归)
紫书上有很明显的笔误, 公式写错了.g(k, i)的那个公式应该加上c(k-1)而不是c(k).如果加上c(k-1)那就是这一次 所有的红气球的数目, 肯定大于最下面i行的红气球数 我用的是f的公式, ...
- 紫书 例题8-4 UVa 11134(问题分解 + 贪心)
这道题目可以把问题分解, 因为x坐标和y坐标的答案之间没有联系, 所以可以单独求两个坐标的答案 我一开始想的是按照左区间从小到大, 相同的时候从右区间从小到大排序, 然后WA 去uDebug找了数据 ...
- 紫书 例题8-17 UVa 1609 (构造法)(详细注释)
这道题用构造法, 就是自己依据题目想出一种可以得到解的方法, 没有什么规律可言, 只能根据题目本身来思考. 这道题的构造法比较复杂, 不知道刘汝佳是怎么想出来的, 我想的话肯定想不到. 具体思路紫书上 ...
- 紫书 例题 9-5 UVa 12563 ( 01背包变形)
总的来说就是价值为1,时间因物品而变,同时注意要刚好取到的01背包 (1)时间方面.按照题意,每首歌的时间最多为t + w - 1,这里要注意. 同时记得最后要加入时间为678的一首歌曲 (2)这里因 ...
- UVa 11082 (网络流建模) Matrix Decompressing
网络流不难写,难的建一个能解决问题的模型.. 即使我知道这是网络流专题的题目,也绝不会能想出这种解法,=_=|| 题意: 给出一个矩阵的 前i行和 以及 前i列和,然后找到一个满足要求的矩阵,而且每个 ...
- 紫书 例题11-7 UVa 753 (网络流最大流)
设一个源点, 到所有设备连一条弧, 容量为1, 然后设一个汇点, 所有插座到汇点连弧, 容量为1, 然后 转换器也连一条弧, 容量为1. 最后最大流就是答案.其中注意节点数要开大一些. #includ ...
- 紫书 例题 10-26 UVa 11440(欧拉函数+数论)
这里用到了一些数论知识 首先素因子都大于M等价与M! 互质 然后又因为当k与M!互质且k>M!时当且仅当k mod M! 与M!互质(欧几里得算法的原理) 又因为N>=M, 所以N!为M! ...
随机推荐
- Kendo UI diagram 更改connnect线颜色,及shapes的属性值
1.改diagram中连线的颜色:redraw一下就OK // Change the Line Green diagram.connections[indexS].redraw({ stroke:{ ...
- laravel报错:MassAssignmentException
报这种错误是因为没有设置白名单或者黑名单.在使用fill填充时,需要设置白/黑名单. $model->fill($params);return $model->save(); 找到对应的m ...
- STM32 软件模拟 IIC 代码,标准库、HAL库可用
#ifndef _IIC_H #define _IIC_H #include "stdio.h" #include "stm32f1xx_hal.h" /* 定 ...
- ASP.net session丢失
ASP.NET Session的实现: asp.net的Session是基于HttpModule技术做的,HttpModule可以在请求被处理之前,对请求进行状态控制,由于Session本身就是用来做 ...
- freeradius 启动报错Refusing to start with libssl version OpenSSL 1.0.1
改动etc/raddb下的radiusd.conf文件 找到allow_vulnerable_openssl = no,改动成allow_vulnerable_openssl = yes
- linux 命令 xxd
xxd,能够查看linux下文件的二进制表示.man一下xxd.能够得到下面信息 NAME xxd - make a hexdump or do the reverse. SYNOPSI ...
- hdu 4544 湫湫系列故事——消灭兔子 优先队列+贪心
将兔子的血量从小到大排序,箭的威力也从小到大排序, 对于每仅仅兔子将威力大于血量的箭增加队列,写个优先队列使得出来数位价钱最少.. #include<stdio.h> #include&l ...
- ZOJ 1696 Viva Confetti 计算几何
计算几何:按顺序给n个圆覆盖.问最后能够有几个圆被看见.. . 对每一个圆求和其它圆的交点,每两个交点之间就是可能被看到的圆弧,取圆弧的中点,往外扩展一点或者往里缩一点,从上往下推断有没有圆能够盖住这 ...
- node12---mongodb
一.传统数据库技术回顾 数据库就是存储数据的,那么存储数据就用txt就行了啊,为什么要有数据库? 理由之1: 数据库有行.列的概念,数据有关系,数据不是散的. 老牌数据库,比如MySQL.SQL Se ...
- GitHub客户端和Shell的基本操作和理解
GitHub客户端和Shell指令的简单实用 客户端操作, web端操作, shell指令操作. 掌握了这三种操作,基本上就可以很好的运用gitHub了. 创建项目, 可以通过web端进行创建. 可以 ...