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

#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. JAVA作业-1

    编写一个程序,用户输入两个数,求出其加减乘除,并用消息框显示计算结果. import javax.swing.JOptionPane; // import class JOptionPane publ ...

  2. android 数据库的增删改查的另一种方式

    老师笔记 # 3 Android下另外一种增删改查方式         1.创建一个帮助类的对象,调用getReadableDatabase方法,返回一个SqliteDatebase对象 2.使用Sq ...

  3. Typical sentences in SCI papers

       Beginning  1. In this paper, we focus on the need for   2. This paper proceeds as follow.   3. Th ...

  4. 使用 CocoStudio UI 编辑器实现《乱斗堂》设置界面

    由于是引用别人的,所以直接贴上地址了.http://www.cocoachina.com/bbs/read.php?tid=164820&fpage=7 1 游戏中必不可少的 UI 元素    ...

  5. 使用kyototycoon挂载leveldb,映射内存磁盘的使用心得

    前段时间在做大数据的KV引擎应用,测试了leveldb的性能,感觉挺好的,美中不足的是他是基于磁盘读写.在我们的场景里,IO频率预计会远远超出磁盘的承受能力,并且太频繁的读取可能也会引发磁盘恶化的速度 ...

  6. Fedora 19 配置参考

    1. 安装完Fedora 19之后,第一件事不是升级系统,而是添加源. 下载我配置好的源,非常全面,适用Fedora 19 x86_64.点我下载 打开终端,切换到repo.zip所在目录:mv re ...

  7. 开始进入Windows Phone 8开发

    和大家一起分享从零开始,入手Windows Phone 8开发,大家一起来吧!

  8. Python的类变量和对象变量声明解析

    Python的类和C++一样,也都是存在两种类型的变量,类变量和对象变量!前者由类拥有,被所有对象共享,后者由每个对象独有.这里我主要想讨论一下他们的声明办法. 首先说的是对象变量: 只要是声明在类的 ...

  9. LVS-HA

    heartbeat 监听在udp的694的端口   LRM:本地资源管理器 CRM:资源管理器 RA:资源代理(脚本) heartbeat legacy : heartbeat 传统类型的资源代理,通 ...

  10. document.write() 和 document.writeln() 区别

    写javascript页面时,看到这两个函数,第一感觉应该是一个换行,一个不换行, 但是实际使用时是一样的(writeln()函数在浏览器页面会多一个空格而不是换行). 简单搜索查阅了下: 查看源 d ...