题意就是

给一个50 * 50的矩阵

然后给出每行每列元素的和

和一个初始矩阵

矩阵中有些是未知,有些是已知

然后我们求目标矩阵就是把能确定的元素的值求出来,实在不能确定的就置为-1

所有矩阵元素的值在0-100之间

看到范围很小。

第一反应是求一个最大流

先把已经给出的元素都从每行每列的和中减掉。

然后左边为行结点,右边为列结点

然后源点向行结点连边

列结点向汇点连边

行和列中如果对应的元素未知就连一下,流向上限是100

然后这样我们就得到了一个可行解

但是可能有多解怎么办

对于一个可能多解的元素

如果我们将这个元素的值固定住。

然后建立一个超级源点与该行结点连边。

该列结点与超级汇点连边。

流量都是1,

跑一遍看看有没有增广路。

如果有,显然这个位置的值是可以改变的,就是多解,然后我们把这个位置的元素值-1,因为我们刚才增广了,其他有元素的值增加了1,所以

为了保持流量的平衡,这个位置的元素要减1

但是这样还不行。

我们想想。

如果该位置的值现在是0怎么办。

他没法减掉1。

所以我们就要想想残余网络了。

既然他没法减掉1,就让他想办法+1,让别的元素-1去

那么我们可以用一个超级源点连接列结点。

行结点连接超级汇点

跑最大流,看有没有增广路。

也就是看他的残余网络能不能减掉1.即它自身+1

如果有增广路,跟之前一样,更新一下边

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#define MAXN 106
#define MAXM 211111
#define INF 1111111111
using namespace std;
struct EDGE
{
int v, next;
int w;
}edge[MAXM];
int head[MAXN], e;
void init()
{
memset(head, -1, sizeof(head));
e = 0;
}
void add(int u, int v, int w)
{
edge[e].v = v;
edge[e].w = w;
edge[e].next = head[u];
head[u] = e++;
edge[e].v = u;
edge[e].w = 0;
edge[e].next = head[v];
head[v] = e++;
}
int n;
int h[MAXN];
int gap[MAXN];
int src, des;
int tt[111][111];
int dfs(int pos, int cost)
{
if(pos == des) return cost;
int j, minh = n - 1;
int lv = cost, d;
for(j = head[pos]; j != -1; j = edge[j].next)
{
int v = edge[j].v;
int w = edge[j].w;
if(w > 0)
{
if(h[v] + 1 == h[pos])
{
if(lv < edge[j].w) d = lv;
else d = edge[j].w;
d = dfs(v, d);
edge[j].w -= d;
edge[j ^ 1].w += d;
lv -= d;
if(h[src] >= n) return cost - lv;
if(lv == 0) break;
}
if(h[v] < minh) minh = h[v];
}
}
if(lv == cost)
{
--gap[h[pos]];
if(gap[h[pos]] == 0) h[src] = n;
h[pos] = minh + 1;
++gap[h[pos]];
}
return cost - lv;
}
int sap()
{
int ret = 0;
memset(gap, 0, sizeof(gap));
memset(h, 0, sizeof(h));
gap[0] = n;
while(h[src] < n) ret += dfs(src, INF);
return ret;
}
int nt, m;
int col[55], row[55];
int val[55][55], id[55][55];
int ans[55][55];
int vis[55][55]; int main()
{
//freopen("C:/C.in", "r", stdin);
//freopen("C:/C2.out", "w", stdout);
while(scanf("%d%d", &nt, &m) != EOF)
{
if(!nt && !m) break;
for(int i = 1; i <= nt; i++)
for(int j = 1; j <= m; j++)
scanf("%d", &val[i][j]);
for(int i = 1; i <= nt; i++) scanf("%d", &row[i]);
for(int i = 1; i <= m; i++) scanf("%d", &col[i]);
memset(ans, -1, sizeof(ans));
for(int i = 1; i <= nt; i++)
for(int j = 1; j <= m; j++)
{
if(val[i][j] != -1)
{
row[i] -= val[i][j];
col[j] -= val[i][j];
ans[i][j] = val[i][j];
}
} init();
src = nt + m + 1;
des = nt + m + 2;
n = des;
int S = nt + m + 3;
int T = nt + m + 4; for(int i = 1; i <= nt; i++)
for(int j = 1; j <= m; j++)
{
if(ans[i][j] == -1)
{
id[i][j] = e;
add(i, j + nt, 100);
}
}
for(int i = 1; i <= nt; i++)
{
add(src, i, row[i]);
}
for(int j = 1; j <= m; j++)
{
add(j + nt, des, col[j]);
}
sap();
n = T;
memset(vis, 0, sizeof(vis));
for(int i = 1; i <= nt; i++)
for(int j = 1; j <= m; j++)
if(ans[i][j] != -1) vis[i][j] = 2;
src = S;
des = T;
for(int i = 1; i <= nt; i++)
{
for(int j = 1; j <= m; j++)
{
if(vis[i][j] == 2) continue;
int te = id[i][j];
int tmp = edge[te ^ 1].w;
edge[te].w = edge[te ^ 1].w = 0;
int flag = 1;
int le = e;
add(src, i, 1);
int me = e;
add(j + nt, des, 1);
if( tmp && sap()) flag = 0, tmp--;
edge[le].w = edge[le ^ 1].w = 0;
edge[me].w = edge[me ^ 1].w = 0;
le = e;
add(src, j + nt, 1);
me = e;
add(i, des, 1);
if(flag && 100 - tmp > 0&& sap()) flag = 0, tmp++;
edge[le].w = edge[le ^ 1].w = 0;
edge[me].w = edge[me ^ 1].w = 0; edge[te ^ 1].w = tmp;
edge[te].w = 100 - tmp;
vis[i][j] = flag;
} }
for(int i = 1; i <= nt; i++)
for(int j = 1; j <= m; j++)
{
if(vis[i][j] == 2)
{
if(ans[i][j] != -1) printf("%d", ans[i][j]);
}
else
{
if(vis[i][j]) printf("%d", edge[id[i][j] ^ 1].w);
else printf("-1");
}
if(j < m) printf(" ");
else printf("\n");
} }
return 0;
}

Uvalive 4865 Data Recovery 最大流的更多相关文章

  1. DRA(Data Recovery Advisor)的使用

    关于DRA的官方描述: The simplest way to diagnose and repair database problems is to use the Data Recovery Ad ...

  2. VMware Data Recovery备份恢复vmware虚拟机

    VMware Data Recovery 是VMware虚拟机备份工具,可创建虚拟机备份,同时不会中断虚拟机的使用或虚拟机提供的数据和服务.Data Recovery 管理现有备份,并在这些备份过时后 ...

  3. 转:主流数据恢复软件——EasyRecovery/Ashampoo Undeleter/Wise Data Recovery/Recuva/Undelete 360

    转自:Baidu 空间 2012-10-05 13:57 主流数据恢复软件——EasyRecovery/Ashampoo Undeleter/Wise Data Recovery/Recuva/Und ...

  4. Data Recovery Advisor (DRA)

    数据恢复指导Data Recovery Advisor (DRA)的适用场景:Data Recovery Advisor 是11g 新特性,是Oracle 顾问程序架构的一部分,它会在遇到错误时自动收 ...

  5. Data Recovery Advisor(数据恢复顾问)

    Data Recovery Advisor 是11g新特性,是Oracle顾问程序架构的一部分,它会在遇到错误时自动收集有关故障信息.如果主动运行Data Recovery Advisor,通常可以在 ...

  6. Percona Data Recovery Tool for InnoDB工具恢复单表的案例

    今天上班有个朋友询问我,相关Percona Data Recovery Tool for InnoDB恢复数据中的一些问题,比如说delete,没法恢复数据,原先做过类似的异常处理就,再次模拟了下相关 ...

  7. 使用Percona Data Recovery Tool for InnoDB恢复数据

      运维工作中难免会发生一些误操作,当数据库表被误操作删除需要紧急恢复,或者没有备份时,Percona Data Recovery Tool for InnoDB这个工具也已提供一些便捷的恢复. 当然 ...

  8. Android Data Recovery for Mac(安卓数据恢复软件)破解版安装

    1.软件简介    Android Data Recovery 是 macOS 系统上一款 Android 设备数据恢复软件,能够帮助我们在 mac 电脑上对 Android 设备进行数据恢复,文档. ...

  9. Aiseesoft Data Recovery 1.1.6 专业数据恢复软件破解版

    Aiseesoft Data Recovery是专业的数据恢复软件,它可以帮助你恢复几乎所有删除/丢失的文件,如照片,文件,电子邮件,音频,视频且支持从计算机,硬盘驱动器,闪存驱动器,存储卡,数码相机 ...

随机推荐

  1. Intellij IDEA13 创建多模块Maven项目

    目标:构建一个类似于如下图所示的这种结构的Maven项目. 首先,需要选中“File”——>“New Project”如下图所示 选中“Maven”,设置项目名称与项目构建地址,点击“Next” ...

  2. GUI for git|SourceTree|入门基础

    原文链接:http://www.jianshu.com/p/be9f0484af9d 目录 SourceTree简介 SourceTree基本使用 SourceTree&Git部分名词解释 相 ...

  3. bdyyservice.exe 系统错误

    现象:开机出现 bdyyservice.exe 系统错误,说: 计算机中丢失log_report.dll 原因:安装百度影音,卸载后出现的问题 解决方法: 所有程序 -> 附件 -> 命令 ...

  4. .net4.0下 解决asp.net中“从客户端中检测到有潜在危险的Request.Form值”的错误

    asp.net 2.0 通常解决办法 方案一: 将.aspx文件中的page项添加ValidateRequest="false" ,如下: <%@ Page Validate ...

  5. [转载]initwithcoder和 initwithframe

    大前提是UIViewController有一个UIView.同时,需要厘清两个概念,创建一个类和实例化一个类.在XCode中创建一个类和实例化一个类很容易区分,但是在IB(Interface Buil ...

  6. POJ 2125 Destroying The Graph (二分图最小点权覆盖集+输出最小割方案)

    题意 有一个图, 两种操作,一种是删除某点的所有出边,一种是删除某点的所有入边,各个点的不同操作分别有一个花费,现在我们想把这个图的边都删除掉,需要的最小花费是多少. 思路 很明显的二分图最小点权覆盖 ...

  7. S2sh整合MAven项目所需坐标大全

    <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> & ...

  8. 剖析OkHttp缓存机制

    现在应用市场上的 App 无一不需要网络操作,这些应用的开发者大多数都选择结合使用 OkHttp 和 Retrofit 来完成网络操作.okHttp 最为人称道的一个特性就是它的缓存机制,而我将在本篇 ...

  9. SQLSERVER 检查字段值域并输出行数和值列表

    select * from ( SELECT 'C_DILEI' as fen,'地类' as fcn, 'NVARCHAR'as ftype, '2'as flen, ( SELECT count( ...

  10. 2014 IGF 评选(转)

    前两天受邀去上海参加今年的独立游戏节评选,准确说是亚洲及太平洋地区的 IGF . 居然有接近 400 个参选游戏是让我事前没有想到的,尤其是在学生组还发现了不少好作品是个惊喜. 评审用了整整两天时间, ...