[ZJOI2009]狼和羊的故事【网络流】【最大流(最小割)】
>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
>解题思路
最小割,也就是最大流完成
- SSS向所有狼连一条权值为infinfinf的边
- 所有羊向TTT连一条权值为infinfinf的边
- 所有狼向周围的空地和羊连一条权值为111的边
- 所有空地向周围的其它空地和羊连一条权值为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]狼和羊的故事【网络流】【最大流(最小割)】相关推荐
- P2598-狼和羊的故事【最大流,最小割】
正题 评测记录: https://www.luogu.org/recordnew/lists?uid=52918&pid=P2598 大意 有n*m的矩阵,里面有羊和狼(也有可能是空),可以在 ...
- BZOJ1412 ZJOI2009 狼和羊的故事 【网络流-最小割】
BZOJ1412 ZJOI2009 狼和羊的故事 Description "狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......" Orez听 ...
- bzoj1412[ZJOI2009]狼和羊的故事
bzoj1412[ZJOI2009]狼和羊的故事 题意: n*m网格,每个格子可能为狼.羊或空格.现在要在一些格子边界篱笆使羊狼分开,求最短篱笆.n,m≤100 题解: 最小割问题,建一个超级源和超级 ...
- 题解 P2598 【[ZJOI2009]狼和羊的故事】
P2598 [ZJOI2009]狼和羊的故事 题目描述 "狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......" Orez听到这首歌,心想:狼 ...
- [ZJOI2009]狼和羊的故事【最小割】
题目链接 P2598 [ZJOI2009]狼和羊的故事 要让羊和狼都区别开来,需要的最小的割是多少?每只羊向四周有4个可能的方向,每只狼也是同样的,所以每个动物向周围可以跑出4个流,我们要建立栅栏,可 ...
- BZOJ 1412: [ZJOI2009]狼和羊的故事
1412: [ZJOI2009]狼和羊的故事 >原题链接< Description "狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......& ...
- [bzoj1934]: [ZJOI2009]狼和羊的故事
1412: [ZJOI2009]狼和羊的故事 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3105 Solved: 1567 [Submit][ ...
- bzoj1412: [ZJOI2009]狼和羊的故事(最小割)
传送门 首先,考虑只有狼和羊怎么办.我们把源点向所有羊连边,容$inf$,所有狼向汇点连边,容$inf$,然后羊向周围所有的狼连边,容$1$.那么,只要求一个割就能把狼和羊给分开,求一个最小割就是答案 ...
- [ZJOI2009]狼和羊的故事 题解
狼和羊的故事 怎么说呢,这道题其实不难,只是题意有那么亿点点难理解.我最开始想复杂了,理解为了栅栏长度是格点的周长,那事情就复杂了... 题目分析: 首先,要明确的是:一个狼领地和羊领地之间只需建长度 ...
- 【bzoj】 1412: [ZJOI2009]狼和羊的故事
Description "狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......" Orez听到这首歌,心想:狼和羊如此和谐,为什么不尝试羊狼合 ...
最新文章
- 用C语言解“用天平找小球”题
- jenkins+maven+Tomcat+shell构建自动化部署
- docker环境下solr6.0配置(中文分词+拼音)
- 《雷达技术丛书》分享
- python拼接字符串的方法_python—字符串拼接三种方法
- 【AI视野·今日Robot 机器人论文速览 第十一期】Mon, 21 Jun 2021
- Java多线程_JUC包下的阻塞队列
- 9. PHP 字符串
- Windows64位下DNW的安装及使用
- Java学习 之 画图板 立方体
- 【镀金与沉金工艺的区别,今后得选“沉金”】
- 工程师职称条件及任职要求
- C/C++编程:libcurl学习(linux + cmake windows10 + vs2019)
- 【10639 Hello Kitty】
- iOS Newsstand Tutorial(IOS报刊亭教程)
- CCV入门教程(二)
- 直接在 PS 上使用 Google Font 字体:Fontea Photoshop 扩展工具推荐
- 推荐 :主成分分析用于可视化(附链接)
- linux下的ant编译,linux 中部署ant编译的包中缺少问题
- 2021-2022学年广州市西关外国语学校九年级第一学期12月考英语试题
热门文章
- 复化柯特斯matlab,基于牛顿‑柯特斯公式构造背景值的GM(1,1)模型预测方法与流程...
- 2022年第二届中国高校大数据挑战赛A题探究
- 日常所用的耳机接口定义
- 科学道德与学术诚信 计算机,关于开展2020级研究生科学道德和学术诚信教育工作的通知...
- Corn fields(玉米田)状压dp入门第一题 洛谷P1879 poj3254
- 简单爬今日头条街拍获取图集
- u-boot 学习系列 1 - SPL
- 用ASP.NET建立一个在线RSS新闻聚合器
- Redis源码分析 —— 发布与订阅
- 广义势能函数和带电粒子在电磁场中的运动