hdu 4888 Redraw Beautiful Drawings(最大流,判环)
pid=4888">http://acm.hdu.edu.cn/showproblem.php?pid=4888
加入一个源点与汇点,建图例如以下:
1. 源点 -> 每一行相应的点,流量限制为该行的和
2. 每一行相应的点 -> 每一列相应的点,流量限制为 K
3. 每一列相应的点 -> 汇点,流量限制为该列的和
求一遍最大流,若最大流与矩阵之和相等,说明有解,否则无解。推断唯一解,是推断残量网络中是否存在一个长度大于2的环。若存在说明有多解,否则有唯一解,解就是每条边行i->列j的流量。
#include <stdio.h>
#include <iostream>
#include <map>
#include <set>
#include <stack>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#include <stdlib.h>
#include <algorithm>
#define LL long long
#define _LL __int64
#define eps 1e-12
#define PI acos(-1.0)
#define C 240
#define S 20
using namespace std; const int INF = 0x3f3f3f3f; const int maxn = 810;
const int maxm = 160000+810; struct node
{
int u,v,w,next;
} edge[maxm << 1]; int cnt,head[maxn];
int n,m,k,s,t;
int nn[410],mm[410];
int maxflow;
int vis[maxn];
int dis[maxn]; void init()
{
cnt = 0;
memset(head,-1,sizeof(head));
} void add(int u, int v, int f)
{
edge[cnt] = (struct node){u,v,f,head[u]};
head[u] = cnt++; edge[cnt] = (struct node){v,u,0,head[v]};
head[v] = cnt++;
} bool bfs()
{
queue<int>que;
while(!que.empty()) que.pop();
memset(dis,-1,sizeof(dis));
dis[s] = 0;
que.push(s); while(!que.empty())
{
int u = que.front();
que.pop(); for(int i = head[u]; i != -1; i = edge[i].next)
{
int v = edge[i].v;
if(dis[v] == -1 && edge[i].w)
{
dis[v] = dis[u]+1;
que.push(v);
}
}
}
if(dis[t] == -1)
return false;
return true;
} int dfs(int u, int delta)
{
if(u == t || delta == 0) return delta;
int dd;
int ret = 0;
for(int i = head[u]; i != -1 && delta; i = edge[i].next)
{
if(dis[edge[i].v] == dis[u]+1 && (dd = dfs(edge[i].v,min(delta,edge[i].w))))
{
edge[i].w -= dd;
edge[i^1].w += dd;
delta -= dd;
ret += dd;
if(delta == 0)
return ret;
}
}
dis[u] = -1;
return ret;
} int Dinic()
{
int ret = 0;
while(bfs())
{
ret += dfs(s,INF);
}
return ret;
} int dfs_1(int u,int fa)
{
for(int i=head[u]; i!=-1; i=edge[i].next)
{
if(i==(fa^1)) continue;
if(edge[i].w)
{
if(vis[edge[i].v]) return 1;
vis[edge[i].v]=1;
if(dfs_1(edge[i].v,i)) return 1;
vis[edge[i].v]=0;
}
}
return 0;
} void putmat()
{
int f[410][410];
printf("Unique\n");
for(int u = 1; u <= n; u++)
{
for(int i = head[u]; i != -1; i = edge[i].next)
{
int v = edge[i].v;
if(v > n && v <= n+m)
f[u][v-n] = k - edge[i].w;
}
}
for(int i = 1; i <= n; i++)
{
for(int j = 1; j < m; j++)
printf("%d ",f[i][j]);
printf("%d\n",f[i][m]);
}
} int main()
{
while(~scanf("%d %d %d",&n,&m,&k))
{
init();
s = 0;
t = n+m+1;
int sum1 = 0;
int sum2 = 0;
for(int i = 1; i <= n; i++)
{
scanf("%d",&nn[i]);
add(s,i,nn[i]);
sum1 += nn[i];
for(int j = 1; j <= m; j++)
add(i,j+n,k);
} for(int i = 1; i <= m; i++)
{
scanf("%d",&mm[i]);
add(i+n,t,mm[i]);
sum2 += mm[i];
} if(sum1 != sum2)
{
printf("Impossible\n");
} else
{
maxflow = Dinic(); if(maxflow != sum1)
{
printf("Impossible\n");
}
else
{
int flag = 0;
memset(vis,0,sizeof(vis));
for(int i = 1; i <= n; i++)
{
if(dfs_1(i,-1))
{
flag = 1;
break;
}
}
if(flag == 1)
printf("Not Unique\n"); else
putmat();
}
}
}
return 0;
}
hdu 4888 Redraw Beautiful Drawings(最大流,判环)的更多相关文章
- hdu4888 Redraw Beautiful Drawings 最大流+判环
hdu4888 Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/6553 ...
- hdu 4888 Redraw Beautiful Drawings 最大流
好难好难,将行列当成X和Y,源汇点连接各自的X,Y集,容量为行列的和,相当于从源点流向每一行,然后分配流量给每一列,最后流入汇点,这样执意要推断最后是否满流,就知道有没有解,而解就是每一行流向每一列多 ...
- hdu 4888 Redraw Beautiful Drawings 网络流
题目链接 一个n*m的方格, 里面有<=k的数, 给出每一行所有数的和, 每一列所有数的和, 问你能否还原这个图, 如果能, 是否唯一, 如果唯一, 输出还原后的图. 首先对行列建边, 源点向行 ...
- HDU 4888 Redraw Beautiful Drawings(最大流+判最大流网络是否唯一)
Problem Description Alice and Bob are playing together. Alice is crazy about art and she has visited ...
- HDU 4888 Redraw Beautiful Drawings
网络流. $s$向每一个$r[i]$连边,容量为$r[i]$. 每一个$r[i]$向每一个$c[j]$连边,容量为$k$. 每一个$c[j]$向$t$连边容量为$c[j]$. 跑最大流,中间每一条边上 ...
- HDU 4888 Redraw Beautiful Drawings(2014 Multi-University Training Contest 3)
题意:给定n*m个格子,每个格子能填0-k 的整数.然后给出每列之和和每行之和,问有没有解,有的话是不是唯一解,是唯一解输出方案. 思路:网络流,一共 n+m+2个点 源点 到行连流量为 所给的 ...
- HDU 4888 Redraw Beautiful Drawings 网络流 建图
题意: 给定n, m, k 以下n个整数 a[n] 以下m个整数 b[n] 用数字[0,k]构造一个n*m的矩阵 若有唯一解则输出这个矩阵.若有多解输出Not Unique,若无解输出Impossib ...
- 【HDU】4888 Redraw Beautiful Drawings 网络流【推断解是否唯一】
传送门:pid=4888">[HDU]4888 Redraw Beautiful Drawings 题目分析: 比赛的时候看出是个网络流,可是没有敲出来.各种反面样例推倒自己(究其原因 ...
- HDU Redraw Beautiful Drawings 推断最大流是否唯一解
点击打开链接 Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 ...
随机推荐
- Qt 5.8.3 部署/添加 Crypto++第三方库(5.6.5版本)
首先,Qt没有封装加解密算法库(其实有个哈希函数的函数).介于OpenSSL函数封装不友好,以及先前爆发的心脏滴血漏洞广受诟病,我们考虑在C++上使用一种新的,并且封装友好的,OOAD程度更高的加解密 ...
- CAD把一个dwg文件,或者图像文件当着一个背景导入(com接口VB语言)
主要用到函数说明: MxDrawXCustomFunction::Mx_OpenBackgroundFile 把一个dwg文件,或者图像文件当着一个背景导入.详细说明如下: 参数 说明 CString ...
- 有关bash,我希望我能知晓的十件事
简介 我之前的一篇文章比我预想的更受欢迎,因此我想再写一篇文章来介绍一些不太知名的bash功能 正如之前所言,由于我觉得bash是一种要经常使用(且需理解)的技术,所以我在研究bash时写了一本书.虽 ...
- SSH命令行传输文件到远程服务器
Ubuntu操作系统 SCP命令 使用方式如下: 1.上传本地文件到远程服务器 scp /var/www/test.php root@192.168.0.101:/var/www/ 把本机/var/w ...
- docker 转载
写的非常好的一篇文章,不知道为什么被删除了. 利用Google快照,做个存档. 快照地址:地址 作者地址:青牛 什么是docker Docker 是一个开源项目,诞生于 2013 年初,最初是 do ...
- mysql服务无法启动(1067错误)时数据备份的经验
mysql服务无法启动(1067错误)时数据备份的经验 背景 方法 背景 在已安装MySQL5.5的情况下,再次安装 MySQL5.7时,因为MySQL5.7是压缩文件安装的方式,复制MySQL5.5 ...
- 洛谷——P4296 [AHOI2007]密码箱
P4296 [AHOI2007]密码箱 密码x大于等于0,且小于n,而x的平方除以n,得到的余数为1. 求这个密码,$1<=n<=2,000,000,000$ 暴力枚举,数据有点儿水$O( ...
- Storm 开箱笔记
目录 Storm 开箱 1. 什么是 Storm 2. Hello World(WordCountTopology) 3. 常用API 4. 基本概念 5. 流分组策略 6. 并行度 7. Acker ...
- db2构建临时结果集
一 values ('1',2,3) 为一行 ‘1’ 2 3 行数据类型可以不同 values ('1',2,3),('f',5,6) 为两行 (values 1,2,3 ...
- How to read and write multiple files in Python?
Goal: I want to write a program for this: In a folder I have =n= number of files; first read one fil ...