[BZOJ 1412] 狼与羊的故事
Link:
Solution:
非常明显的最小割模型:
将所有点分成两个互不相邻的点集,且要求代价最小
建图:
$<S,sheep,INF>$
$<wolf,T,INF>$
$<sheep,wolf/ground,1>$、$<ground,wolf/sheep/ground,1>$
Code:
#include <bits/stdc++.h> using namespace std;
const int MAXN=,MAXM=,INF=<<;
namespace Max_Flow
{
int head[MAXN],S,T,level[MAXN],iter[MAXN],tot=-;
struct edge{int nxt,to,cap;}e[MAXM<<]; void add_edge(int from,int to,int cap)
{
e[++tot].nxt=head[from];e[tot].to=to;e[tot].cap=cap;head[from]=tot;
e[++tot].nxt=head[to];e[tot].to=from;e[tot].cap=;head[to]=tot;
}
bool bfs()
{
memset(level,-,sizeof(level));
queue<int> q;q.push(S);level[S]=;
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=head[u];i!=-;i=e[i].nxt)
if(e[i].cap && level[e[i].to]==-)
level[e[i].to]=level[u]+,q.push(e[i].to);
}
return (level[T]!=-);
}
int dfs(int v,int f)
{
if(v==T) return f;
int ret=;
for(int &i=iter[v];i!=-;i=e[i].nxt)
{
if(level[e[i].to]==level[v]+ && e[i].cap)
{
int d=dfs(e[i].to,min(f,e[i].cap));
e[i].cap-=d;e[i^].cap+=d;
f-=d;ret+=d;if(!f) break;
}
}
return ret;
}
int Dinic()
{
int ret=;
while(bfs())
{
for(int i=;i<MAXN;i++) iter[i]=head[i];
ret+=dfs(S,INF);
}
return ret;
}
} int dx[]={,-,,},dy[]={,,,-};
int n,m,dat[][]; int main()
{
using namespace Max_Flow;
S=;T=;memset(head,-,sizeof(head));
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%d",&dat[i][j]); for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
if(dat[i][j]==) add_edge(S,(i-)*m+j,INF);
if(dat[i][j]==){add_edge((i-)*m+j,T,INF);continue;}
for(int k=;k<;k++)
{
int fx=i+dx[k],fy=j+dy[k];
if(fx<||fx>n||fy<||fy>m) continue;
if(dat[i][j]!= || dat[fx][fy]!=)
add_edge((i-)*m+j,(fx-)*m+fy,);
}
}
printf("%d",Dinic());
return ;
}
[BZOJ 1412] 狼与羊的故事的更多相关文章
- BZOJ 1412 狼和羊的故事
首先,题目目的就是为了分割狼群和羊群,即建立超级源和超级汇求最小割从而转化成用网络流来处理. 如果没有空地,那么就是简单的二分图最大匹配,但是题中有空地的出现,所以需要在点与点之间建立双向边(不算后向 ...
- [BZOJ 1412][ZJOI 2009] 狼和羊的故事
题目大意 有一个 (n times m) 的网格,每一个格子上是羊.狼.空地中的一种,羊和狼可以走上空地.现要在格子边上建立围栏,求把狼羊分离的最少围栏数. (1 leqslant n, ; m le ...
- BZOJ 1412: [ZJOI2009]狼和羊的故事( 最小割 )
显然是最小割...把狼的领地连S, 羊的领地连T, 然后中间再连边, 跑最大流就OK了 -------------------------------------------------------- ...
- bzoj1412: [ZJOI2009]狼和羊的故事
空地之间开始没有连然后一直WA...题意混乱...尴尬. #include<cstdio> #include<cstring> #include<iostream> ...
- BZOJ1412 [ZJOI2009]狼和羊的故事 【最小割】
1412: [ZJOI2009]狼和羊的故事 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3454 Solved: 1733 [Submit][ ...
- 【BZOJ1412】狼和羊的故事(网络流)
[BZOJ1412]狼和羊的故事(网络流) 题面 Description "狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......" Orez听 ...
- P2598 [ZJOI2009]狼和羊的故事(网络流)
P2598 [ZJOI2009]狼和羊的故事 源点和所有狼连 $inf$ 的边 所有羊和汇点连 $inf$ 的边 所有点向四周连 $1$ 的边 这样所有狼和羊之间的边都被割掉了 统计最小割就好辣 #i ...
- 洛谷 P2598 [ZJOI2009]狼和羊的故事 解题报告
P2598 [ZJOI2009]狼和羊的故事 题目描述 "狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......" \(Orez\)听到这首歌, ...
- 题解 P2598 【[ZJOI2009]狼和羊的故事】
P2598 [ZJOI2009]狼和羊的故事 题目描述 "狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......" Orez听到这首歌,心想:狼 ...
随机推荐
- 在cmd运行脚本
1.打开cmd 2.cd到脚本目录,运行所有脚本的上级目录,我的是cd C:\Users\Administrator\PycharmProjects\webtest\TestSuit 3.使用Pyth ...
- 孤荷凌寒自学python第三十一天python的datetime.timedelta模块
孤荷凌寒自学python第三十一天python的datetime.timedelta模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) datetime.timedelta模块是一个表示 ...
- ThreadLocal 学习
JDK 1.2版本就已经提供了java.lang.ThreadLocal.其为多线程程序的并发问题提供了一种新的思路.使用该工具类可以简洁地编写出优美的多线程程序. 当使用ThreadLocal维护变 ...
- Android 图片文字单位 px、dp、sp区别
文章来源:http://www.cnblogs.com/bjzhanghao/archive/2012/11/06/2757300.html px:像素,一个像素点,1px代表屏幕上一个物理的像素点: ...
- over窗口函数进阶
over窗口函数的其他灵活的用法.即,统计当前行的前N行及后N行数据.转自:https://blog.csdn.net/ck3207/article/details/84954511 先来看一下数据的 ...
- min_free_kbytes是内存最安全值的阈值,然后这个值是怎么影响到系统内存回收的呢?
min_free_kbytes 内存域水印值:min_free_kbytes 当不设置的时候:sqrt(16M)=4k 4k*4 = 16k 设置内存水印值的函数是: 6792 /* 6793 * I ...
- [bzoj2038] [2009国家集训队]小Z的袜子
Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只 ...
- Codeforces 359D Pair of Numbers | 二分+ST表+gcd
题面: 给一个序列,求最长的合法区间,合法被定义为这个序列的gcd=区间最小值 输出最长合法区间个数,r-l长度 接下来输出每个合法区间的左端点 题解: 由于区间gcd满足单调性,所以我们可以二分区间 ...
- Sublime Text 2 HTML代码缩进 美化HTML代码
关于代码格式的美化,之前在win下一直用“alignment”这个插件,它能实现一键对齐和缩进.最近使用mac版的sublime text 2,不知道是什么原因,这个插件疑似失效…… 这对有洁癖的完美 ...
- 圆盘自动机 cell
圆盘自动机 cell 一个n-m圆盘自动机,包含n个排列成一圈的方格,它们按1至n编号.每个方格中有一个整数,范围[0,m-1] .圆盘会进行d操作,每次d操作会使得每个方格中的数同时变换,变换为与其 ...