链接:http://acm.hdu.edu.cn/showproblem.php?

pid=4888

题意:一个矩阵。限定每行行和、列和,每一个格子数字不超过k,问矩阵是否存在,如存在推断有单解还是多解。

思路:之前多校的题目,那时候还不会网络流,如今A掉了,矩阵的建图模型,推断网络流是否可行仅仅要推断最大流是否等于总行和或总列和就可以,判环是看的别人的解题报告,方法是使用dfs查找残余网络中是否有还存在容量的弧形成了环,假设有,说明能够通过这个环改变容量网络内部的增广路方式。而源汇的流量是不会变的。就说明存在多解。假设没有环,就是单一解。

建图:源点向每一个行节点连弧,容量为该行行和,每一个列节点向汇点连边,容量为每一个列和,每一个行节点与每一个列节点之间连边,容量为k。

细节:之前WA了,我以为是minm赋值的问题,实际上minm赋值为nn-1是没问题的,仅仅要赋值大于等于nn-1即可了。WA的地方在dist[i]=-1时须要特判。统计层次时对-1不会统计,假设不加推断,会使数组下标变成-1,就错了。HDU上不是RE。是WA。之前一直没加过也AC了两题,如今知道了。

#include<cstring>
#include<string>
#include<fstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cctype>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<stack>
#include<ctime>
#include<cstdlib>
#include<functional>
#include<cmath>
using namespace std;
#define PI acos(-1.0)
#define MAXN 50100
#define eps 1e-7
#define INF 0x7FFFFFFF
#define LLINF 0x7FFFFFFFFFFFFFFF
#define seed 131
#define MOD 1000000007
#define ll long long
#define ull unsigned ll
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1 struct node{
int u,v,w,next;
}edge[500000];
int head[820],dist[820],cur[820],fa[820],num[820],vis[820];
int n,m,k,cnt,nn,src,sink;
void add_edge(int a,int b,int c){
edge[cnt].u = a;
edge[cnt].v = b;
edge[cnt].w = c;
edge[cnt].next = head[a];
head[a] = cnt++;
}
void bfs()
{
int x,i,j;
queue<int> q;
memset(dist,-1,sizeof(dist));
q.push(sink);
dist[sink] = 0;
while(!q.empty()){
x = q.front();
q.pop();
for(i=head[x];i!=-1;i=edge[i].next){
if(dist[edge[i].v]<0){
dist[edge[i].v] = dist[x] + 1;
q.push(edge[i].v);
}
}
}
} int augment()
{
int x=sink,a=INF;
while(x!=src){
a = min(a,edge[fa[x]].w);
x = edge[fa[x]].u;
}
x=sink;
while(x!=src){
edge[fa[x]].w -= a;
edge[fa[x]^1].w += a;
x = edge[fa[x]].u;
}
return a;
} int isap()
{
int i,x,ok,minm,flow=0;
memset(num,0,sizeof(num));
bfs();
for(i=0;i<=nn+5;i++) if(dist[i]!=-1) num[dist[i]]++;
for(i=0;i<=nn+5;i++) cur[i] = head[i];
x=src;
while(dist[src]<nn){
if(x==sink){
flow += augment();
x = src;
}
ok=0;
for(i=cur[x];i!=-1;i=edge[i].next){
if(edge[i].w && dist[x]==dist[edge[i].v]+1){
ok=1;
fa[edge[i].v] = i;
cur[x] = i;
x = edge[i].v;
break;
}
}
if(!ok){
minm = nn - 1;
for(i=head[x];i!=-1;i=edge[i].next)
if(edge[i].w && dist[edge[i].v]<minm) minm=dist[edge[i].v];
if(--num[dist[x]]==0)break;
num[dist[x]=minm+1]++;
cur[x]=head[x];
if(x!=src) x=edge[fa[x]].u;
}
}
return flow;
}
bool dfs(int u,int pre){
int i,j;
if(vis[u]) return true;
vis[u] = 1;
for(i=head[u];i!=-1;i=edge[i].next){
if(edge[i].w>0&&edge[i].v!=pre&&dfs(edge[i].v,u))
return true;
}
vis[u] = 0;
return false;
}
int row[410],col[410];
int ans[420][420];
int main(){
int i,j;
int sumr,sumc;
while(scanf("%d%d%d",&n,&m,&k)!=EOF){
memset(head,-1,sizeof(head));
sumr = sumc = 0;
cnt = 0;
src = 0;
sink = n + m + 1;
nn = sink + 1;
for(i=1;i<=n;i++){
scanf("%d",&row[i]);
sumr += row[i];
add_edge(src,i,row[i]);
add_edge(i,src,0);
for(j=1;j<=m;j++){
add_edge(i,j+n,k);
add_edge(j+n,i,0);
}
}
for(i=1,j=n+1;i<=m;j++,i++){
scanf("%d",&col[i]);
sumc += col[i];
add_edge(j,sink,col[i]);
add_edge(sink,j,0);
}
if(sumr!=sumc){
puts("Impossible");
continue;
}
int flag = 0;
int flow = isap();
if(flow!=sumr){
puts("Impossible");
continue;
}
memset(vis,0,sizeof(vis));
for(i=1;i<=n;i++){
if(dfs(i,-1)){
flag = 1;
break;
}
}
if(flag){
puts("Not Unique");
continue;
}
puts("Unique");
memset(ans,0,sizeof(ans));
for(i=1;i<=n;i++){
for(j=head[i];j!=-1;j=edge[j].next){
int u = edge[j].v;
if(u>n&&u<=n+m){
ans[i][u-n] = k - edge[j].w;
}
}
}
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
if(j>1) printf(" ");
printf("%d",ans[i][j]);
}
printf("\n");
}
}
return 0;
}

HDUOJ--4888--Redraw Beautiful Drawings【isap】网络流+判环的更多相关文章

  1. hdu4888 Redraw Beautiful Drawings 最大流+判环

    hdu4888 Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/6553 ...

  2. 【HDU】4888 Redraw Beautiful Drawings 网络流【推断解是否唯一】

    传送门:pid=4888">[HDU]4888 Redraw Beautiful Drawings 题目分析: 比赛的时候看出是个网络流,可是没有敲出来.各种反面样例推倒自己(究其原因 ...

  3. hdu 4888 Redraw Beautiful Drawings 网络流

    题目链接 一个n*m的方格, 里面有<=k的数, 给出每一行所有数的和, 每一列所有数的和, 问你能否还原这个图, 如果能, 是否唯一, 如果唯一, 输出还原后的图. 首先对行列建边, 源点向行 ...

  4. HDU 4888 Redraw Beautiful Drawings(最大流+判最大流网络是否唯一)

    Problem Description Alice and Bob are playing together. Alice is crazy about art and she has visited ...

  5. HDU 4888 Redraw Beautiful Drawings 网络流 建图

    题意: 给定n, m, k 以下n个整数 a[n] 以下m个整数 b[n] 用数字[0,k]构造一个n*m的矩阵 若有唯一解则输出这个矩阵.若有多解输出Not Unique,若无解输出Impossib ...

  6. hdu 4888 Redraw Beautiful Drawings(最大流,判环)

    pid=4888">http://acm.hdu.edu.cn/showproblem.php?pid=4888 加入一个源点与汇点,建图例如以下: 1. 源点 -> 每一行相应 ...

  7. HDU 4888 Redraw Beautiful Drawings(2014 Multi-University Training Contest 3)

    题意:给定n*m个格子,每个格子能填0-k 的整数.然后给出每列之和和每行之和,问有没有解,有的话是不是唯一解,是唯一解输出方案. 思路:网络流,一共 n+m+2个点   源点 到行连流量为 所给的 ...

  8. HDU 4888 Redraw Beautiful Drawings

    网络流. $s$向每一个$r[i]$连边,容量为$r[i]$. 每一个$r[i]$向每一个$c[j]$连边,容量为$k$. 每一个$c[j]$向$t$连边容量为$c[j]$. 跑最大流,中间每一条边上 ...

  9. hdu 4888 Redraw Beautiful Drawings 最大流

    好难好难,将行列当成X和Y,源汇点连接各自的X,Y集,容量为行列的和,相当于从源点流向每一行,然后分配流量给每一列,最后流入汇点,这样执意要推断最后是否满流,就知道有没有解,而解就是每一行流向每一列多 ...

  10. Redraw Beautiful Drawings(hdu4888)网络流+最大流

    Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/O ...

随机推荐

  1. 杂项-Java:自定义标签

    ylbtech-杂项-Java:自定义标签 1.返回顶部 1. 一般我们说自定义标签是指JSP自定义标签.自定义标签在功能上逻辑上与javaBean 类似,都封装Java 代码.自定义标签是可重用的组 ...

  2. 基于Spark的网站日志分析

    本文只展示核心代码,完整代码见文末链接. Web Log Analysis 提取需要的log信息,包括time, traffic, ip, web address 进一步解析第一步获得的log信息,如 ...

  3. Java压缩技术(三) ZIP解压缩——Java原生实现

    原文:http://snowolf.iteye.com/blog/642492 JavaEye的朋友跟我说:“你一口气把ZIP压缩和解压缩都写到一个帖子里,我看起来很累,不如分开好阅读”.ok,面向读 ...

  4. 使用logback实现http请求日志导入mongodb

    spring boot自带logback作为其日志新系统,但是在实际工作中,常常需要对日志进行管理或分析,如果只是单纯的将日志导入文本文件,则在查询时操作过于繁琐,如果将其导入mysql等关系型数据库 ...

  5. ROS-导航功能-Gazebo

    前言:仿真的整体思路,先启动仿真环境,再启动导航功能. 前提:已下载并编译了相关功能包集,如还未下载,可通过git下载:https://github.com/huchunxu/ros_explorin ...

  6. Hibernate搭建框架(一)

    什么是hibernate? hibernate是一个orm框架,实现了对JDBC的封装.通过xml文件来实现类和表之间的映射,这样就可以使用操作对象的方式来操作数据库. 官网:http://hiber ...

  7. Cannot find module 'crc'

    这个时候你只需要打开你nodejs安装的目录,在其中执行 npm install crc(这里查什么模块(module)就安装什么模块).

  8. SQLServer XXX IS NOT NULL

    SQLServer中不能使用像Java和C#中的  XXX!=null   这种用法, 使用上面的用法返回值永远是False False False 正确的用法应该是--> XXXis not ...

  9. Get 和 Post

    理论: Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而 ...

  10. Tour UVA - 1347

    John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane and starts vi ...