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的矩阵.每个格子里都将有一个数.给你每一行数字之和和每 ...
随机推荐
- Codevs 1003 电话连线
时间限制: 1 s 空间限制: 128000 K 题目等级 : 黄金 Gold 题目描述 Description 一个国家有n个城市.若干个城市之间有电话线连接,现在要增加m条电话线(电话线当 ...
- ASP.NET MVC强制返回XML
GlobalConfiguration.Configuration.Formatters.Remove(config.Formatters.JsonFormatter);
- Android下各个按键对应的key code
KEYCODE_UNKNOWN=0; KEYCODE_SOFT_LEFT=1; KEYCODE_SOFT_RIGHT=2; KEYCODE_HOME=3; KEYCODE_BACK=4; KEYCOD ...
- java中对集合对象list的几种循环访问
java中对集合对象list的几种循环访问的总结如下 1 经典的for循环 public static void main(String[] args) { List<String> li ...
- 用python实现两个文本合并
一段时间前在网上看到一段面试题,要求如下: employee文件中记录了工号和姓名 cat employee.txt: 100 Jason Smith 200 John Doe 300 Sanjay ...
- oracle-12c-rac 报:ORA-01078
OS: Oracle Linux Server release 5.7 DB: Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - ...
- Java中的main()方法详解
在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是 ...
- oracle 存储过程编辑 卡死
一.可用SYS登录, 二.查锁session_ID查找存储过程OPERATIONDATA_IMP被哪些session锁住而无法编译select * FROM dba_ddl_locks where n ...
- class_create(),device_create()使用
开始写Linux设备驱动程序的时候,很多时候都是利用mknod命令手动创建设备节点(包括ldd3中不少例子也是这样),实际上现在Linux内核为我们提供了一组函数,可以用来在模块加载的时候自动在/de ...
- Serverless 架构:用服务代替服务器
Serverless 架构:用服务代替服务器 转载本文需注明出处:EAII企业架构创新研究院(微信号:eaworld),违者必究.如需 加入微信群参与微课堂.架构设计与讨论直播请直接回复此公众号:&q ...