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(最大流,判环)的更多相关文章

  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 最大流

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

  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

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

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

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

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

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

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

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

  9. HDU Redraw Beautiful Drawings 推断最大流是否唯一解

    点击打开链接 Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 ...

随机推荐

  1. eclipse中添加maven

    收藏一下,一篇很好的例子 maven相关插件:链接:http://pan.baidu.com/s/1i3Ks95j 密码:7pgh eclipse:链接:http://pan.baidu.com/s/ ...

  2. (转) 淘淘商城系列——Redis集群的搭建

    http://blog.csdn.net/yerenyuan_pku/article/details/72860432 本文我将带领大家如何搭建Redis集群.首先说一下,为何要搭建Redis集群.R ...

  3. CAD由一个自定义实体事件中的id得到自定义实体对象(com接口VB语言)

    由一个自定义实体事件中的id得到自定义实体对象.该函数只能在自定义实体事件中调用. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 2 ...

  4. CAD设置背景图片

    把图片作为背景图片可见但是不能编辑操作. 主要用到函数说明: _DMxDrawX::DrawImageToBackground 绘光栅图到背景.详细说明如下: 参数 说明 BSTR sFileName ...

  5. JAVA程序员面试笔试宝典4

    1.HTTP中GET与POST方法有什么区别? GET方法上传数据时,数据添加在URL后面.同时,数据大小有限制,通常在1024Byte左右.POST方法传递数据是通过HTTP请求的附件进行的,传递的 ...

  6. jenkins自动部署测试环境

    构建脚本如下: echo "当前目录":$(pwd)echo "当前时间":$(date +%Y-%m-%d_%H:%M)find ./ -type f -na ...

  7. 我已经迷失在事件环(event-loop)中了【Nodejs篇】

    我第一次看到他事件环(event-loop)的时候,我是一脸懵,这是什么鬼,是什么循环吗,为什么event还要loop,不是都是一次性的吗? 浏览器中和nodejs环境中的事件环是有一些区别的,这里我 ...

  8. extjs动态插入一列

    StdDayWordQuery:function(btn,event){ var form=Ext.getCmp('queryFormSDW'); var userNameORuserCode = f ...

  9. 重置默认样式 css reset

    html { overflow-x:auto; overflow-y:scroll; } body, dl, dt, dd, ul, ol, li, pre, form, fieldset, inpu ...

  10. Luogu P4549 裴蜀定理 / Min

    思路 题目已经给出了正解.我们只需要将裴蜀定理推广到若干数的线性组合就可以做这道题了 要注意的是需要在输入的时候取一个绝对值.因为可能会有负数存在.我之前也写过裴蜀定理的证明,要看的话点这里 吐槽 第 ...