网络流建模,建模不难,难在找环;

#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstring>
#define inf 1<<30
#define maxn 2100
using namespace std; struct edge
{
int from,to,cap,flow;
edge(int from,int to,int cap,int flow):from(from),to(to),cap(cap),flow(flow) {}
}; struct dinic
{
int n,m,s,t;
vector<edge>edges;
vector<int>g[maxn];
bool vis[maxn];
int d[maxn];
int cur[maxn];
bool ishuan[maxn];
int jie[][]; void init(int n)
{
this->n=n;
for(int i=; i<n; i++)
g[i].clear();
edges.clear();
memset(d,,sizeof d);
memset(cur,,sizeof cur);
} void addedge(int from,int to,int cap)
{
edges.push_back(edge(from,to,cap,));
edges.push_back(edge(to,from,,));
m=edges.size();
g[from].push_back(m-);
g[to].push_back(m-);
}
queue<int >q;
bool bfs()
{
memset(vis,,sizeof vis);
while(!q.empty()) q.pop();
q.push(s);
d[s]=;
vis[s]=;
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=; i<g[x].size(); i++)
{
edge& e=edges[g[x][i]];
if(!vis[e.to]&&e.cap>e.flow)
{
vis[e.to]=;
d[e.to]=d[x]+;
q.push(e.to);
}
}
}
return vis[t];
} int dfs(int x,int a)
{
if(x==t||a==)return a;
int flow=,f;
for(int &i=cur[x]; i<g[x].size(); i++)
{
edge& e=edges[g[x][i]];
if(d[x]+==d[e.to]&&(f=dfs(e.to,min(a,e.cap-e.flow)))>)
{
e.flow+=f;
edges[g[x][i]^].flow-=f;
flow+=f;
a-=f;
if(a==)break;
}
}
return flow;
} int maxflow(int s,int t)
{
this->s=s;
this->t=t;
int flow=; while(bfs())
{
memset(cur,,sizeof cur);
flow+=dfs(s,inf);
}
return flow;
} bool panhuan(int v,int f)
{
if(ishuan[v])return ;
ishuan[v]=;
for(int i=;i<g[v].size();i++)
{
if(g[v][i]==(f^))continue;
int tmp=g[v][i];
if(edges[tmp].to==t||edges[tmp].to==s)continue;
if(edges[tmp].cap-edges[tmp].flow>)
{
if(panhuan(edges[tmp].to,tmp))return ;
}
}
ishuan[v]=;
return ;
} bool haofang(int x)
{
memset(ishuan,,sizeof ishuan);
for(int i=; i<=x; i++)
{
if(panhuan(i,-))return ;
}
return ;
} void getans(int x,int y)
{
for(int i=;i<edges.size();i++)
{
if(edges[i].cap&&edges[i].from>&&edges[i].from<=x)
{
jie[edges[i].from][edges[i].to-x]=edges[i].flow;
}
}
}
}; int hang[];
int lie[]; dinic solve; int main()
{
int n,m,k;
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
int sum_hang=,sum_lie=;
for(int i=; i<=n; i++)
{
scanf("%d",&hang[i]);
sum_hang+=hang[i];
}
for(int i=; i<=m; i++)
{
scanf("%d",&lie[i]);
sum_lie+=lie[i];
}
if(sum_hang!=sum_lie)
{
puts("Impossible");
continue;
}
solve.init(n+m+);
solve.s=;
solve.t=n+m+;
for(int i=;i<=n;i++)
{
solve.addedge(solve.s,i,hang[i]);
for(int j=;j<=m;j++)
solve.addedge(i,j+n,k);
}
for(int i=;i<=m;i++)
solve.addedge(i+n,solve.t,lie[i]);
int ans=solve.maxflow(solve.s,solve.t);
if(ans!=sum_hang)
puts("Impossible");
else
{
if(solve.haofang(n))
puts("Not Unique");
else
{
puts("Unique");
solve.getans(n,m);
for(int i=;i<=n;i++)
{
for(int j=;j<m;j++)
printf("%d ",solve.jie[i][j]);
printf("%d\n",solve.jie[i][m]);
}
}
}
}
return ;
}

hdu 4888的更多相关文章

  1. 2014联合三所学校 (HDU 4888 HDU 4891 HDU 4893)

    HDU 4891 The Great Pan 注册标题  他怎么说,你怎么样  需要注意的是乘法时,它会爆炸int 代码: #include<iostream> #include<c ...

  2. hdu 4888 最大流慢板

    http://acm.hdu.edu.cn/showproblem.php?pid=4888 添加一个源点与汇点,建图如下: 1. 源点 -> 每一行对应的点,流量限制为该行的和 2. 每一行对 ...

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

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

  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(2014 Multi-University Training Contest 3)

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

  6. HDU 4888 (网络流)

    Poroblem Redraw Beautiful Drawings (HDU4888) 题目大意 一个n行m列的矩形,只能填0~k的数字. 给定各行各列的数字和,判定有无合法的方案数.一解给出方案, ...

  7. hdu 4888 Redraw Beautiful Drawings 网络流

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

  8. hdu 4888 Redraw Beautiful Drawings 最大流

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

  9. 【2014 Multi-University Training Contest 3 1002】/【HDU 4888】 Redraw Beautiful Drawings

    不easy啊.最终能够补第二个题了.! 顺便说一句:模版写残了就不要怪出题人啊 ~ (这残废模版研究了好长时间才找出错) 题目大意: 有一个n*m的矩阵.每个格子里都将有一个数.给你每一行数字之和和每 ...

随机推荐

  1. socket.io问题,io.sockets.manager.rooms和io.sockets.clients('particular room')这两个函数怎么用?

    为什么我用nodejs用这个两个函数获取都会出错呢?是不是socket的api改了?请问现在获取房间数和当前房间的客户怎么获取?什么函数?谢谢!!急求!     网友采纳 版本问题.io.socket ...

  2. 使用zookeeper实现分布式master选举(c 接口版本)

    zookeeper,已经被很多人所熟知,主要应用场景有(数据订阅/发布 ,负载均衡, 命名服务, 分布式协调/通知,集群管理,Master选举,分布式锁,分布式队列). C接口的描述  主要参考 Ha ...

  3. centos安装环境准备工作

    我们的centos系统安装好了,并且网络已经连通了,接下来介绍一下,在外网连通的情况下,我们如何安装tar.gz等形式的软件. centos安装后如果想作为正常应用development tools和 ...

  4. Andriod docs加载速度慢的问题解决

    网上找了个类, import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import ja ...

  5. 京东sdk商家上架接口调用问题总结(更新中...)

    前言: 最近在做商家发布产品,调用京东sdk,发现问题很多,而且还是在我同事的帮助下完成的,摸索中,菜鸟还请高手门多多提携才好,入正题 首先是引用jd的sdk啦,京东sdk中发布商品需要调用一个 36 ...

  6. php取得当前访问url文件名的几种方法

    php下获取当前访问的文件名的几种方法.推荐函数:一是PHP获取当前页面的网址: dedecms用的也是这个哦. <?php //获得当前的脚本网址 function GetCurUrl() { ...

  7. WPF之Binding对数据的转换(第五天)

    Binding在Slider控件与TextBox控件之间建立关联,值可以互相绑定,但是它们的数据类型是不同的,Slider是Double类型,Text为String.原来,Binding有一种机制称为 ...

  8. Linux之mount命令详解

    linux下挂载(mount)光盘映像文档.移动硬盘.U盘.Windows和NFS网络共享linux是个优秀的开放源码的操作系统,能够运行在大到巨型小到掌上型各类电脑系统上,随着linux系统的日渐成 ...

  9. java 接口(基础思想一)

    我想,对于各位使用面向对象编程语言的程序员来说,“接口”这个名词一定不陌生,但是不知各位有没有这样的疑惑:接口有什么用途?它和抽象类有什么区别?能不能用抽象类代替接口呢?而且,作为程序员,一定经常听到 ...

  10. docker 感性体验

    Docker 1.0正式发布!1.0 版本包含很多新特性,这也是 Docker 的首个产品级的版本.从今天开始,你将会一直听到一个新的概念 —— Docker as a platform ,其组件包括 ...