HDU3046 最大流(最小割)
Pleasant sheep and big big wolf |
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) |
Total Submission(s): 19 Accepted Submission(s): 14 |
Problem Description
In ZJNU, there is a well-known prairie. And it attracts pleasant sheep and his companions to have a holiday. Big big wolf and his families know about this, and quietly hid in the big lawn. As ZJNU ACM/ICPC team, we have an obligation to protect pleasant sheep and his companions to free from being disturbed by big big wolf. We decided to build a number of unit fence whose length is 1. Any wolf and sheep can not cross the fence. Of course, one grid can only contain an animal.
Now, we ask to place the minimum fences to let pleasant sheep and his Companions to free from being disturbed by big big wolf and his companions. |
Input
There are many cases.
For every case: N and M(N,M<=200) |
Output
For every case:
First line output “Case p:”, p is the p-th case; |
Sample Input
|
Sample Output
|
题意:
n*m的场地中,1表示羊,2表示狼,0表示空地,问建最少的篱笆能把狼和羊分离开。
代码:
- //篱笆的长度是1,我们假设把狼放在S集合,羊放在T集合,求S,T的最小割就是答案。
- //狼连接源点,羊连接汇点,相邻的各点之间连\无向边/。最小割=最大流。
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<vector>
- #include<queue>
- #include<cmath>
- using namespace std;
- const int maxn=,inf=0x7fffffff;
- struct edge{
- int from,to,cap,flow;
- edge(int u,int v,int c,int f):from(u),to(v),cap(c),flow(f){}
- };
- struct dinic{
- int n,m,s,t;
- vector<edge>edges;
- vector<int>g[maxn];
- bool vis[maxn];
- int d[maxn];
- int cur[maxn];
- void init(int n){
- this->n=n;
- for(int i=;i<n;i++) g[i].clear();
- edges.clear();
- }
- 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-);
- }
- bool bfs(){
- memset(vis,,sizeof(vis));
- queue<int>q;
- q.push(s);
- d[s]=;
- vis[s]=;
- while(!q.empty()){
- int x=q.front();q.pop();
- for(int i=;i<(int)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<(int)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;
- }
- }dc;
- int main()
- {
- int n,m,cas=,mp[][];
- while(scanf("%d%d",&n,&m)==){
- for(int i=;i<=n;i++)
- for(int j=;j<=m;j++) scanf("%d",&mp[i][j]);
- int s=,t=n*m+;
- dc.init(n*m+);
- for(int i=;i<=n;i++)
- for(int j=;j<=m;j++){
- int nu=(i-)*m+j;
- if(mp[i][j]==) dc.addedge(s,nu,inf);
- if(mp[i][j]==) dc.addedge(nu,t,inf);
- if(i>) dc.addedge(nu,nu-m,);
- if(i<n) dc.addedge(nu,nu+m,);
- if(j>) dc.addedge(nu,nu-,);
- if(j<m) dc.addedge(nu,nu+,);
- }
- printf("Case %d:\n%d\n",++cas,dc.maxflow(s,t));
- }
- return ;
- }
HDU3046 最大流(最小割)的更多相关文章
- 最大流-最小割 MAXFLOW-MINCUT ISAP
简单的叙述就不必了. 对于一个图,我们要找最大流,对于基于增广路径的算法,首先必须要建立反向边. 反向边的正确性: 我努力查找了许多资料,都没有找到理论上关于反向边正确性的证明. 但事实上,我们不难理 ...
- 最大流&最小割 - 专题练习
[例1][hdu5889] - 算法结合(BFS+Dinic) 题意 \(N\)个点\(M\)条路径,每条路径长度为\(1\),敌人从\(M\)节点点要进攻\(1\)节点,敌人总是选择最优路径即最短路 ...
- UVa11248 Frequency Hopping(最大流+最小割)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33206 [思路] 最大流最小割. 可以确定的是如果不可行需要修改的 ...
- matlab练习程序(最大流/最小割)
学习这个算法是为学习图像处理中的图割算法做准备的. 基本概念: 1.最大流是一个有向图. 2.一个流是最大流,当且仅当它的残余网络中不包括增广路径. 3.最小割就是网络中所有割中值最小的那个割,最小割 ...
- 「网络流24题」「LuoguP2774」方格取数问题(最大流 最小割
Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.对于给定的方 ...
- HDU6582 Path【优先队列优化最短路 + dinic最大流 == 最小割】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6582 来源:2019 Multi-University Training Contest 1 题目大意 ...
- ISAP 最大流 最小割 模板
虽然这道题用最小割没有做出来,但是这个板子还是很棒: #include<stdio.h> #include<math.h> #include<string.h> # ...
- Codeforces 965 枚举轮数贪心分糖果 青蛙跳石头最大流=最小割思想 trie启发式合并
A /*#include<cstring>#include<algorithm>#include<queue>#include<vector>#incl ...
- 网络流 最大流—最小割 之SAP算法 详解
首先引入几个新名词: 1.距离标号: 所谓距离标号 ,就是某个点到汇点的最少的弧的数量(即边权值为1时某个点到汇点的最短路径长度). 设点i的标号为level[i],那么如果将满足level[i]=l ...
- nyoj-677-最大流最小割
677-碟战 内存限制:64MB 时间限制:2000ms 特判: No通过数:2 提交数:2 难度:4 题目描述: 知己知彼,百战不殆!在战争中如果被敌人掌握了自己的机密,失败是必然的.K国在一场战争 ...
随机推荐
- es6从零学习(一)let 和 const 命令
es6从零学习(一):let 和 const 命令 一:let 变量 1.块级作用域{}:let只在自己的块级作用域内有效. for(let i =0;i<3;i++) { console.lo ...
- Git 命令详解及常用命令
Git 命令详解及常用命令 Git作为常用的版本控制工具,多了解一些命令,将能省去很多时间,下面这张图是比较好的一张,贴出了看一下: 关于git,首先需要了解几个名词,如下: 1 2 3 4 Work ...
- Alpha 冲刺(2/10)
队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 协助前端界面的开发 搭建测试用服务器的环境 完成 ...
- 什么是POJO模式
1. 什么是POJO POJO的名称有多种,pure old java object .plain ordinary java object 等. 按照Martin Fowler的解释是“Pl ...
- 全排列 next_permutation() 函数的用法
在头文件<algorithm>里面有如下代码: int a[]; do { } while(next_permutation(a,a+n)); 可产生1~n的全排列有如下代码: #incl ...
- Xcode常见警告和错误
Xcode 升级后,常常遇到的遇到的警告.错误,解决方法 从sdk3.2.5升级到sdk 7.1中间废弃了很多的方法,还有一些逻辑关系更加严谨了.1,警告:“xoxoxoxo” is depreca ...
- lol人物模型提取(一)
前段时间去青岛搞团建去了,闲来无事逛了会儿淘宝,无想买个lol手办,意之间发现了这张店铺宣传图: 哎呀我去,这模型做得挺逼真啊,然而这家店铺是卖zoe的cosplay道具的,不是手办-_-|| ...
- java 堆和栈的区别
1,在栈中存放的是基本类型变量和对象的引用变量,当一段代码定义一个变量时,java 就在栈内为这个变量分配内存空间,当超过变量的作用域时,java会自动回收分配的内存. 局部变量在栈内存 2,堆内存放 ...
- volatile并不能保证数据同步、只能保证读取到最新主内存数据
在 java 垃圾回收整理一文中,描述了jvm运行时刻内存的分配.其中有一个内存区域是jvm虚拟机栈,每一个线程运行时都有一个线程栈, 线程栈保存了线程运行时候变量值信息.当线程访问某一个对象时候值的 ...
- 第49天:封装自己的scrollTop
一.scroll家族 offset 自己的偏移scroll滚动的 scrollTop和scrollLeftscrollTop 被卷去的头部当滑动滚轮浏览网页的时候,网页隐藏在屏幕上方的距离二.页面滚动 ...