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的矩阵.每个格子里都将有一个数.给你每一行数字之和和每 ...
随机推荐
- IoC容器的初始化过程
1.简单来说,IoC容器的初始化是由前面介绍的refresh()方法来启动的,这个方法标志着IoC容器的正式启动. 2.具体来说,这个启动包括BeanDefinition的Resource定位.载入和 ...
- [前端插件]Bootstrap Table服务器分页与在线编辑应用总结
先看Bootstrap Table应用效果: 表格用来显示数据库中的数据,数据通过AJAX从服务器加载,同时分页功能有服务器实现,避免客户端分页,在加载大量数据时造成的用户体验不好.还可以设置查询数据 ...
- 1 . Robberies (hdu 2955)
The aspiring Roy the Robber has seen a lot of American movies, and knows that the bad guys usually g ...
- 第二章 开始学习C++
第二章 开始学习C++ 2.1 main函数 简单代码如下: #include <iostream> int main() { //This is my first program u ...
- 试写Python内建函数range()
还没查阅源码,先试着练手 class my_range(object): def __init__(self, *args): if not args: raise TypeError, 'range ...
- 防止双击选中html中文字
在开发过程中很常用的会给<span></span>等内联元素增加一个onlick事件,但是经常发生的一件事情就是点击的时候,选中了span中的字体:倒是不影响主逻辑,但是很难受 ...
- javascript代码复用--继承
由于javascript没有类的概念,因此无法通过接口继承,只能通过实现继承.实现继承是继承实际的方法,javascript中主要是依靠原型链要实现. 原型链继承 原型链继承是基本的继承模式,其本质是 ...
- 【Qt】命令行编译Qt程序(nmake)【转】
简述 前两节讲解了如何在Visual Studio和Qt Creator中搭建Qt开发环境,并分享了我们第一个小程序-Hello World. 下面分享如何使用命令行来编译Qt程序.当然,MSVC和M ...
- [DevExpress]ChartControl之时间轴示例
关键代码: using System; using System.Data; using System.Windows.Forms; using DevExpress.XtraCharts; name ...
- C#inSSIDer强大的wifi无线热点信号扫描器源码
一个完整的无线信号扫描工具源码,包含了从热点扫描到强度绘制以及信号变换曲线图.源码基于Managed Wifi实现基础功能,Managed Wifi也是开源项目,这个可以在本站搜索到. 指定网卡信号扫 ...