hdu 4888
网络流建模,建模不难,难在找环;
#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的更多相关文章
- 2014联合三所学校 (HDU 4888 HDU 4891 HDU 4893)
HDU 4891 The Great Pan 注册标题 他怎么说,你怎么样 需要注意的是乘法时,它会爆炸int 代码: #include<iostream> #include<c ...
- hdu 4888 最大流慢板
http://acm.hdu.edu.cn/showproblem.php?pid=4888 添加一个源点与汇点,建图如下: 1. 源点 -> 每一行对应的点,流量限制为该行的和 2. 每一行对 ...
- hdu 4888 Redraw Beautiful Drawings(最大流,判环)
pid=4888">http://acm.hdu.edu.cn/showproblem.php?pid=4888 加入一个源点与汇点,建图例如以下: 1. 源点 -> 每一行相应 ...
- 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(2014 Multi-University Training Contest 3)
题意:给定n*m个格子,每个格子能填0-k 的整数.然后给出每列之和和每行之和,问有没有解,有的话是不是唯一解,是唯一解输出方案. 思路:网络流,一共 n+m+2个点 源点 到行连流量为 所给的 ...
- HDU 4888 (网络流)
Poroblem Redraw Beautiful Drawings (HDU4888) 题目大意 一个n行m列的矩形,只能填0~k的数字. 给定各行各列的数字和,判定有无合法的方案数.一解给出方案, ...
- hdu 4888 Redraw Beautiful Drawings 网络流
题目链接 一个n*m的方格, 里面有<=k的数, 给出每一行所有数的和, 每一列所有数的和, 问你能否还原这个图, 如果能, 是否唯一, 如果唯一, 输出还原后的图. 首先对行列建边, 源点向行 ...
- hdu 4888 Redraw Beautiful Drawings 最大流
好难好难,将行列当成X和Y,源汇点连接各自的X,Y集,容量为行列的和,相当于从源点流向每一行,然后分配流量给每一列,最后流入汇点,这样执意要推断最后是否满流,就知道有没有解,而解就是每一行流向每一列多 ...
- 【2014 Multi-University Training Contest 3 1002】/【HDU 4888】 Redraw Beautiful Drawings
不easy啊.最终能够补第二个题了.! 顺便说一句:模版写残了就不要怪出题人啊 ~ (这残废模版研究了好长时间才找出错) 题目大意: 有一个n*m的矩阵.每个格子里都将有一个数.给你每一行数字之和和每 ...
随机推荐
- BeanDefinition的载入和解析
1.在完成对代表BeanDefinition的Resource定位的分析后,下面来了解整个BeanDefinition信息的载入过程. 2.对IoC容器来说,这个载入过程,相当于把定义的BeanDef ...
- JDBC连接MySQL数据库及示例
JDBC是Sun公司制定的一个可以用Java语言连接数据库的技术. 一.JDBC基础知识 JDBC(Java Data Base Connectivity,java数据库连接)是一 ...
- 精美jQuery插件及源码 前端开发福利
jQuery是一个非常不错的javascript框架,很多前端开发者喜欢的原因不仅是因为jQuery使用起来方便,更重要的是因为它的插件很多,我们可以将这些插件应用到自己的项目中去.下面这些精美的jQ ...
- 8款强大的CSS3/HTML5动画及应用源码
1.CSS3 jQuery UI控制滑杆插件 今天我们要来分享一款基于CSS3和jQuery UI的控制滑杆插件,这款控制滑杆是在HTML5滑杆元素的基础上进行自定义CSS3渲染,所以外观更加漂亮.另 ...
- centos6.5安装flume
这里安装flume是因为游戏业务日志搜集和分析用的 1.安装java 环境rpm -ivh jdk-8u51-linux-x64.rpm Preparing... ################## ...
- 如何将HDL文件实例化到XPS中
本文转载自:http://xilinx.eetrend.com/blog/7073 硬件平台:ZedBoard 开发环境:XPS + ISE 操作系统:WinXP SP3 一直说要研究官方的例子 ...
- jquery的change 事件
jquery的change 事件 . <script src="jquery.min.js" type="text/javascript">< ...
- gcc常用选项
gcc选项: -c 只编译,不链接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件. -std= 指 ...
- jQuery增加删除修改tab导航特效
HTML: <div class="container iden_top"> <ul> ...
- ckeditor增加上传图片的功能
1.配置config.js开启图片上传选项卡. CKEDITOR.editorConfig = function( config ) { config.filebrowserImageUploadUr ...