显然是最小割...把狼的领地连S, 羊的领地连T, 然后中间再连边, 跑最大流就OK了

--------------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 10009;
const int INF = 100000000;
struct edge {
int to, cap;
edge *next, *rev;
} E[100000], *pt = E, *head[maxn];
inline void add(int u, int v, int w) {
pt->to = v; pt->cap = w; pt->next = head[u]; head[u] = pt++;
}
inline void addedge(int u, int v, int w) {
add(u, v, w); add(v, u, 0);
head[u]->rev = head[v];
head[v]->rev = head[u];
}
edge *p[maxn], *cur[maxn];
int cnt[maxn], h[maxn], mp[109][109], S, T, N;
int maxFlow() {
for(int i = 0; i < N; i++) cur[i] = head[i];
memset(cnt, 0, sizeof cnt); cnt[0] = N;
memset(h, 0, sizeof h);
int flow = 0;
edge* e;
for(int A = INF, x = S; h[S] < N; ) {
for(e = cur[x]; e; e = e->next)
   if(h[e->to] + 1 == h[x] && e->cap) break;
if(e) {
p[e->to] = cur[x] = e;
A = min(A, e->cap);
x = e->to;
if(x == T) {
flow += A;
for(; x != S; x = p[x]->rev->to) {
p[x]->cap -= A;
p[x]->rev->cap += A;
}
A = INF;
}
} else {
if(!--cnt[h[x]]) break;
h[x] = N;
for(e = head[x]; e; e = e->next) if(e->cap && h[e->to] + 1 < h[x]) {
h[x] = h[e->to] + 1;
cur[x] = e;
}
cnt[h[x]]++;
if(x != S) x = p[x]->rev->to;
}
}
return flow;
}
#define id(i, j) ((i) * m + (j))
void init() {
int n, m; scanf("%d%d", &n, &m);
S = n * m; T = S + 1; N = T + 1;
for(int i = 0; i < n; i++)
   for(int j = 0; j < m; j++)
       scanf("%d", mp[i] + j);
for(int i = 0; i < n; i++) 
   for(int j = 0; j < m; j++) {
if(mp[i][j] == 1) addedge(S, id(i, j), INF);
if(mp[i][j] == 2) addedge(id(i, j), T, INF);
if(i - 1 >= 0 && (mp[i][j] != mp[i - 1][j] || !(mp[i][j] | mp[i - 1][j])))
addedge(id(i, j), id(i - 1, j), 1);
if(i + 1 < n && (mp[i][j] != mp[i + 1][j] || !(mp[i][j] | mp[i + 1][j])))
addedge(id(i, j), id(i + 1, j), 1);
if(j - 1 >= 0 && (mp[i][j] != mp[i][j - 1] || !(mp[i][j] | mp[i][j - 1])))
addedge(id(i, j), id(i, j - 1), 1);
if(j + 1 < m && ((mp[i][j] != mp[i][j + 1]) || !(mp[i][j] | mp[i][j+ 1])))
addedge(id(i, j), id(i, j + 1), 1);
   }
}
int main() {
init();
printf("%d\n", maxFlow());
return 0;
}

--------------------------------------------------------------------------

1412: [ZJOI2009]狼和羊的故事

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 1851  Solved: 961
[Submit][Status][Discuss]

Description

“狼爱上羊啊爱的疯狂,谁让他们真爱了一场;狼爱上羊啊并不荒唐,他们说有爱就有方向......” Orez听到这首歌,心想:狼和羊如此和谐,为什么不尝试羊狼合养呢?说干就干! Orez的羊狼圈可以看作一个n*m个矩阵格子,这个矩阵的边缘已经装上了篱笆。可是Drake很快发现狼再怎么也是狼,它们总是对羊垂涎三尺,那首歌只不过是一个动人的传说而已。所以Orez决定在羊狼圈中再加入一些篱笆,还是要将羊狼分开来养。 通过仔细观察,Orez发现狼和羊都有属于自己领地,若狼和羊们不能呆在自己的领地,那它们就会变得非常暴躁,不利于他们的成长。 Orez想要添加篱笆的尽可能的短。当然这个篱笆首先得保证不能改变狼羊的所属领地,再就是篱笆必须修筑完整,也就是说必须修建在单位格子的边界上并且不能只修建一部分。

Input

文件的第一行包含两个整数n和m。接下来n行每行m个整数,1表示该格子属于狼的领地,2表示属于羊的领地,0表示该格子不是任何一只动物的领地。

Output

文件中仅包含一个整数ans,代表篱笆的最短长度。

Sample Input

2 2
2 2
1 1

Sample Output

2

数据范围
10%的数据 n,m≤3
30%的数据 n,m≤20
100%的数据 n,m≤100

HINT

Source

转载于:https://www.cnblogs.com/JSZX11556/p/4811641.html

BZOJ 1412: [ZJOI2009]狼和羊的故事( 最小割 )相关推荐

  1. bzoj 1412 [ZJOI2009]狼和羊的故事 最小割建图

    题面 题目传送门 解法 把\(S\)集看作和羊连接,\(T\)看作和狼连接 然后就转化成了基本的最小割模型了 对于0的处理,可以把它放在羊和狼两排点的中间,由\(S\rightarrow\)羊\(\r ...

  2. 1412: [ZJOI2009]狼和羊的故事 最小割

    高一的时候似乎做了--然后我现在发现不会做了.. (高一代码抄多了QAQ) 题目要求的是将狼和羊分开,可以看做是分成两个点集,要使代价最小,那么也就是求一个最小割. 首先S->狼连边,权值为+∞ ...

  3. BZOJ 1412: [ZJOI2009]狼和羊的故事

    1412: [ZJOI2009]狼和羊的故事 >原题链接< Description "狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......& ...

  4. BZOJ 1412 [ZJOI2009]狼和羊的故事(最小割)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1412 [题目大意] 给出一块地图,1表示狼的领地,2表示羊的领地,0表示其余动物的领地 ...

  5. 【bzoj】 1412: [ZJOI2009]狼和羊的故事

    Description "狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......" Orez听到这首歌,心想:狼和羊如此和谐,为什么不尝试羊狼合 ...

  6. 洛谷 - P2598 [ZJOI2009]狼和羊的故事(最大流最小割)

    题目链接:点击查看 题目大意:给出一个 n * m 的矩阵,每个格子都有三种状态:狼.羊和空地,现在需要在相邻方格之间添加篱笆,问最少需要添加多少篱笆才能使得狼和羊分开 题目分析:最大流最小割,建图方 ...

  7. [bzoj1934]: [ZJOI2009]狼和羊的故事

    1412: [ZJOI2009]狼和羊的故事 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3105  Solved: 1567 [Submit][ ...

  8. bzoj1412[ZJOI2009]狼和羊的故事

    bzoj1412[ZJOI2009]狼和羊的故事 题意: n*m网格,每个格子可能为狼.羊或空格.现在要在一些格子边界篱笆使羊狼分开,求最短篱笆.n,m≤100 题解: 最小割问题,建一个超级源和超级 ...

  9. 题解 P2598 【[ZJOI2009]狼和羊的故事】

    P2598 [ZJOI2009]狼和羊的故事 题目描述 "狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......" Orez听到这首歌,心想:狼 ...

  10. [ZJOI2009]狼和羊的故事【最小割】

    题目链接 P2598 [ZJOI2009]狼和羊的故事 要让羊和狼都区别开来,需要的最小的割是多少?每只羊向四周有4个可能的方向,每只狼也是同样的,所以每个动物向周围可以跑出4个流,我们要建立栅栏,可 ...

最新文章

  1. python数学计算例子_Python OpenCV实例:直方图计算(数学公式简单实现)
  2. Java锁消除和锁粗化
  3. gdb tui的使用
  4. 使用openssh-clients的scp命令来传输文件
  5. 【 HDU - 3062】Party(2-sat)
  6. 《需求工程》阅读笔记之三
  7. telnet 超时_python3从零学习-5.10.10、telnetlib—Telnet 客户端
  8. 内卷太厉害怎么办?多读好书破万“卷”
  9. 一个简单的Blob存取例子
  10. Linux LAMP搭建
  11. Hadoop SequenceFile存储格式入门
  12. 自动化测试基础篇--Selenium中数据参数化之TXT
  13. Java - HashMap源码解析
  14. spring security免登录动态配置方案2
  15. (附源码)微信小程序 Demo
  16. Atitit. Atiposter 发帖机版本历史 编年史
  17. 《软件工程导论第6版》--张海藩 牟永敏 课后答案及其详解 第7章 实现
  18. 在Excel如何根据内容自动调整行高列宽
  19. 走访名校名企,助力生涯规划
  20. 北京注册的公司如何缴纳公积金

热门文章

  1. 游戏中出现服务器维护中怎么办,游戏服务器显示维护中
  2. html3d龙卷风特效代码,使用Canvas 2D模拟出来的3D龙卷风动画特效
  3. Ubuntu系统备份和还原,从此避免系统重装
  4. 【论文笔记】Depth Map Prediction from a Single Image using a Multi-Scale Deep Network
  5. 2021-06-12 lock 锁 与synchronized 锁
  6. idea zip怎么安装_Mybatis源码分析(一): 下载Mybatis源码安装并导入IDEA
  7. 微信小程序即将支持 分享朋友圈 半屏显示
  8. java MAVEN下载的代码仓库位置 mac
  9. 计算机上已安装某个第三方应用程序,防止电脑第三方软件“被”安装 3招彻底屏蔽不明软件...
  10. mysql 月份去0_mysql 查询每个月发布的文章数。月份无数据显示为0。如何写SQL呢...