>Description

羊狼圈是一个n*m个矩阵格子,这个矩阵的边缘已经装上了篱笆。在羊狼圈中再加入一些篱笆,将羊狼分开。狼和羊都有属于自己领地,若狼和羊们不能呆在自己的领地,那它们就会变得非常暴躁,不利于他们的成长。 Orez想要添加篱笆的尽可能的短。当然这个篱笆首先得保证不能改变狼羊的所属领地,再就是篱笆必须修筑完整,也就是说必须修建在单位格子的边界上并且不能只修建一部分。


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

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

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


>解题思路
最小割,也就是最大流完成

  1. SSS向所有狼连一条权值为infinfinf的边
  2. 所有羊向TTT连一条权值为infinfinf的边
  3. 所有狼向周围的空地和羊连一条权值为111的边
  4. 所有空地向周围的其它空地和羊连一条权值为111的边

边权为1很容易想到,因为在相邻的两格中间建篱笆的代价为1
这时我们只要求S~T的最小割就可以完成

乱乱的改了好久TT


>代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define N 110
#define inf 1 << 30
#define S n * m + 1
#define T n * m + 2
#define int long long
using namespace std;const int xx[4] = {-1, 0, 0, 1}, yy[4] = {0, -1, 1, 0};
struct line
{int to, next, w, op;
} a[240005];
int n, m, ans, t, s[N][N], h[N * N], c[N * N];
bool yd[N * N];void add (int x, int y, int ww)
{a[++t] = (line) {y, h[x], ww, t + 1}; h[x] = t; //顺流a[++t] = (line) {x, h[y], 0, t - 1}; h[y] = t; //逆流
}
bool spfa ()
{queue<int> st;memset (c, 0x7f, sizeof (c));memset (yd, 0, sizeof (yd));c[S] = 0; yd[S] = 1;st.push(S);while (!st.empty()){int u = st.front();for (int i = h[u]; i; i = a[i].next)if (a[i].w && c[u] + 1 < c[a[i].to]){c[a[i].to] = c[u] + 1;if (a[i].to == T) return 1; //如果S有路径可以到达T,直接返回1if (!yd[a[i].to]){yd[a[i].to] = 1;st.push(a[i].to);}}yd[u] = 0;st.pop();}return 0;
}
int dfs (int now, int maxf)
{if (now == T) return maxf;int ret = 0;for (int i = h[now]; i; i = a[i].next)if (a[i].w && c[now] + 1 == c[a[i].to]){int f = dfs (a[i].to, min (maxf - ret, a[i].w)); //求最小割a[i].w -= f;a[a[i].op].w += f;ret += f;if (ret == maxf) return ret; //优化}return ret;
}
int dinic () //dinic算法
{int ans = 0;while (spfa ()) ans += dfs (S, inf); //如果有增广路就进行增广return ans;
}signed main()
{scanf ("%lld%lld", &n, &m);for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++){scanf ("%lld", &s[i][j]);if (s[i][j] == 1) add (S, (i - 1) * m + j, inf);else if (s[i][j] == 2) add ((i - 1) * m + j, T, inf);}for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)if (s[i][j] == 0 || s[i][j] == 1)for (int k = 0; k < 4; k++) //四周{int x = i + xx[k], y = j + yy[k];if (x < 1 || x > n || y < 1 || y > m) continue;if (s[x][y] == 2 || s[x][y] == 0)add ((i - 1) * m + j, (x - 1) * m + y, 1);}printf ("%lld", dinic ());return 0;
}

[ZJOI2009]狼和羊的故事【网络流】【最大流(最小割)】相关推荐

  1. P2598-狼和羊的故事【最大流,最小割】

    正题 评测记录: https://www.luogu.org/recordnew/lists?uid=52918&pid=P2598 大意 有n*m的矩阵,里面有羊和狼(也有可能是空),可以在 ...

  2. BZOJ1412 ZJOI2009 狼和羊的故事 【网络流-最小割】

    BZOJ1412 ZJOI2009 狼和羊的故事 Description "狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......" Orez听 ...

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

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

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

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

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

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

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

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

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

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

  8. bzoj1412: [ZJOI2009]狼和羊的故事(最小割)

    传送门 首先,考虑只有狼和羊怎么办.我们把源点向所有羊连边,容$inf$,所有狼向汇点连边,容$inf$,然后羊向周围所有的狼连边,容$1$.那么,只要求一个割就能把狼和羊给分开,求一个最小割就是答案 ...

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

    狼和羊的故事 怎么说呢,这道题其实不难,只是题意有那么亿点点难理解.我最开始想复杂了,理解为了栅栏长度是格点的周长,那事情就复杂了... 题目分析: 首先,要明确的是:一个狼领地和羊领地之间只需建长度 ...

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

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

最新文章

  1. 用C语言解“用天平找小球”题
  2. jenkins+maven+Tomcat+shell构建自动化部署
  3. docker环境下solr6.0配置(中文分词+拼音)
  4. 《雷达技术丛书》分享
  5. python拼接字符串的方法_python—字符串拼接三种方法
  6. 【AI视野·今日Robot 机器人论文速览 第十一期】Mon, 21 Jun 2021
  7. Java多线程_JUC包下的阻塞队列
  8. 9. PHP 字符串
  9. Windows64位下DNW的安装及使用
  10. Java学习 之 画图板 立方体
  11. 【镀金与沉金工艺的区别,今后得选“沉金”】
  12. 工程师职称条件及任职要求
  13. C/C++编程:libcurl学习(linux + cmake windows10 + vs2019)
  14. 【10639 Hello Kitty】
  15. iOS Newsstand Tutorial(IOS报刊亭教程)
  16. CCV入门教程(二)
  17. 直接在 PS 上使用 Google Font 字体:Fontea Photoshop 扩展工具推荐
  18. 推荐 :主成分分析用于可视化(附链接)
  19. linux下的ant编译,linux 中部署ant编译的包中缺少问题
  20. 2021-2022学年广州市西关外国语学校九年级第一学期12月考英语试题

热门文章

  1. 复化柯特斯matlab,基于牛顿‑柯特斯公式构造背景值的GM(1,1)模型预测方法与流程...
  2. 2022年第二届中国高校大数据挑战赛A题探究
  3. 日常所用的耳机接口定义
  4. 科学道德与学术诚信 计算机,关于开展2020级研究生科学道德和学术诚信教育工作的通知...
  5. Corn fields(玉米田)状压dp入门第一题 洛谷P1879 poj3254
  6. 简单爬今日头条街拍获取图集
  7. u-boot 学习系列 1 - SPL
  8. 用ASP.NET建立一个在线RSS新闻聚合器
  9. Redis源码分析 —— 发布与订阅
  10. 广义势能函数和带电粒子在电磁场中的运动