uva11082 网络流经典模型 建图详解
来源:互联网 发布:越南使用的什么网络 编辑:程序博客网 时间:2024/05/09 19:21
题意:知道矩阵的前i行之和,和前j列之和(任意i和j都可以)。求这个矩阵。每个格子中的元素必须在1~20之间。矩阵大小上限20*20
首先我们可以随意写出一个答案满足行的限制,然后就需要在每行和不变的情况下,通过调度,满足列的限制,而这个调度的过程,同网络流的流的思想正式契合的,这是网络流思想的很好体现。
建图就是源点连向每个行表示这行的和,然后每列连向汇点,表示这列的和,然后i行向j列连边,表示格子(i,j)将一部分和从行i流向了列j
还有一个小问题就是每个格子的范围是1-20,这样就是一个容量有上下界的问题了,但是实际上可以每个格子都同时加一,就可以完美的避免了将问题复杂化
#include <iostream>#include <queue>#include <cstring>#include <cstdio>#include <algorithm>#define rep(i, j, k) for(int i = j; i <= k; i++)#define maxn 509using namespace std;int n, m, s, t, head[maxn], to[2 * maxn], Next[2 * maxn], flow[2 * maxn], vis[maxn], d[maxn];int ans[21][21], cur[maxn], tot;void add (int u, int v, int w){//if (w) printf ("add %d %d == %d\n", u, v, w);to[++tot] = v;Next[tot] = head[u];head[u] = tot;flow[tot] = w;}bool bfs (){memset (vis, 0, sizeof (vis));queue <int> q;q.push (s);vis[s] = 1;d[s] = 0;while (!q.empty ()){int now = q.front ();q.pop ();for (int i = head[now]; i; i = Next[i])if (!vis[to[i]] && flow[i] > 0){vis[to[i]] = 1;q.push (to[i]);d[to[i]] = d[now] + 1;}}return vis[t];}int dfs (int x, int a){int ret = 0, f;if (x == t || !a)return a;for (int &i = cur[x]; i; i = Next[i])if (d[to[i]] == d[x] + 1 && (f = dfs (to[i], min (a, flow[i]))) > 0){flow[i] -= f;flow[i ^ 1] += f;ret += f;a -= f;if (!a)break;}return ret;}void work (){while (bfs ()){rep (i, s, t)cur[i] = head[i];dfs (s, 0x7fffffff);}}void print (int x){printf ("Matrix %d\n", x);rep (i, 2, n + 1)for (int j = head[i]; j; j = Next[j])if (to[j] != s)ans[i - 1][to[j] - 1 - n] = 20 - flow[j];// printf ("flow ----- %d -> %d == %d\n", i, to[j], 19 - flow[j]);for (int i = 1; i <= n; i++, cout << endl)for (int j = 1; j <= m; j ++, printf (" "))printf ("%d", ans[i][j]);}int main (){int ti;cin >> ti;rep (ff, 1, ti){memset (head, 0, sizeof (head));memset (Next, 0, sizeof (Next));tot = 1;cin >> n >> m;s = 1, t = 1 + n + m + 1;int u, pre = 0;rep (i, 1, n)scanf ("%d", &u),u -= pre, pre += u, add (s, i + 1, u - m), add (i + 1, s, 0);pre = 0;rep (i, 1, m)scanf ("%d", &u),u -= pre, pre += u, add (1 + n + i, t, u - n), add (t, 1 + n + i, 0);rep (i, 1, n)rep (j, 1, m)add (i + 1, j + 1 + n, 19), add (j + 1 + n, i + 1, 0);work ();print (ff);}return 0;}
0 0
- uva11082 网络流经典模型 建图详解
- POJ1459 多源多汇网络流经典模型
- poj1459 网络流经典
- [总结] 网络流经典建模
- poj 3281 Dining 【拆点网络流】【最大流经典问题 关键建图】
- POJ 1149:PIGS 网络流经典题
- hdu2732 网络流经典建图
- uva11082
- UVA11082
- UVa11082
- 网络流经典24题之前三题
- poj 1149 PIGS 【网络流经典建模】【求最大流】
- Dining (POJ No.3281) 网络流经典题
- [网络流最大流经典][uva 11082][矩阵解压]
- uva11082 最大流和网络流建模
- UVA - 1658(网络流经典拆点方法)
- 【 zoj 3348 】Schedule 【网络流经典建图】
- POJ 1149 PIGS(网络流经典建图题)
- SVN命令总结
- iOS从相册选择图片并裁剪,可用于上传头像
- QT按键事件
- java设计模式之装饰模式
- 通过手机端访问PC端网页项目
- uva11082 网络流经典模型 建图详解
- Git 常用命令
- Android修改默认休眠时间
- 盘点六款适用于企业移动办公的通讯工具
- 二叉排序树(Binary Sort Tree)
- Android 修改默认屏幕亮度
- Php中的素数筛选
- 深度学习框架的比较(MXNet, Caffe, TensorFlow, Torch, Theano)
- kaldi中改写sre10/v1用timit dataset做说话人识别总结