BZOJ 1412 [ZJOI2009]狼和羊的故事 | 网络流
显然是个最小割嘛!
一开始我是这么建图的:
- 源点向狼连INF
- 羊向汇点连INF
- 每两个相邻格子间连双向边,边权为1
然后T成狗
后来我是这么建图的:
- 源点向狼连INF
- 羊向汇点连INF
- 狼和空地向相邻的非狼节点连1
然后跑得 跟HK Journalist 跟中午抢饭的国大班同学们一样快
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long ll;
#define enter putchar('\n')
#define space putchar(' ')
template <class T>
void read(T &x){
char c;
bool op = 0;
while(c = getchar(), c > '9' || c < '0')
if(c == '-') op = 1;
x = c - '0';
while(c = getchar(), c >= '0' && c <= '9')
x = x * 10 + c - '0';
if(op) x = -x;
}
template <class T>
void write(T x){
if(x < 0) putchar('-'), x = -x;
if(x >= 10) write(x / 10);
putchar('0' + x % 10);
}
const int W = 105, N = 100005, M = 1000005, INF = 0x3f3f3f3f;
const int dx[] = {0, 0, 1, -1};
const int dy[] = {1, -1, 0, 0};
int n, m, mp[W][W], src, des;
int ecnt = 1, adj[N], cur[N], dis[N], go[M], nxt[M], cap[M];
#define id(x, y) (((x) - 1) * m + (y))
void ADD(int u, int v, int _cap){
go[++ecnt] = v;
nxt[ecnt] = adj[u];
adj[u] = ecnt;
cap[ecnt] = _cap;
}
void add(int u, int v, int _cap){
ADD(u, v, _cap);
ADD(v, u, 0);
}
bool bfs(){
static int que[N], qr;
for(int i = 1; i <= des; i++)
dis[i] = -1, cur[i] = adj[i];
dis[src] = 0, que[qr = 1] = src;
for(int ql = 1; ql <= qr; ql++){
int u = que[ql];
for(int e = adj[u], v; e; e = nxt[e])
if(cap[e] && dis[v = go[e]] == -1){
dis[v] = dis[u] + 1, que[++qr] = v;
if(v == des) return 1;
}
}
return 0;
}
int dfs(int u, int flow){
if(u == des) return flow;
int ret = 0, delta;
for(int &e = cur[u], v; e; e = nxt[e])
if(cap[e] && dis[v = go[e]] == dis[u] + 1){
delta = dfs(v, min(flow - ret, cap[e]));
if(delta){
cap[e] -= delta;
cap[e ^ 1] += delta;
ret += delta;
if(ret == delta) return ret;
}
}
dis[u] = -1;
return ret;
}
int maxflow(){
int ret = 0;
while(bfs()){
int flow;
do{
ret += (flow = dfs(src, INF));
}while(flow);
}
return ret;
}
bool legal(int i, int j){
return i > 0 && j > 0 && i <= n && j <= m && mp[i][j] != 1;
}
int main(){
read(n), read(m), src = n * m + 1, des = src + 1;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
read(mp[i][j]);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++){
if(mp[i][j] == 1) add(src, id(i, j), INF);
else if(mp[i][j] == 2) add(id(i, j), des, INF);
if(mp[i][j] != 2)
for(int k = 0, x, y; k < 4; k++)
if(legal(x = i + dx[k], y = j + dy[k]))
add(id(i, j), id(x, y), 1);
}
write(maxflow()), enter;
return 0;
}
BZOJ 1412 [ZJOI2009]狼和羊的故事 | 网络流的更多相关文章
- BZOJ 1412: [ZJOI2009]狼和羊的故事( 最小割 )
显然是最小割...把狼的领地连S, 羊的领地连T, 然后中间再连边, 跑最大流就OK了 -------------------------------------------------------- ...
- BZOJ 1412: [ZJOI2009]狼和羊的故事【网络流】
Description “狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......” Orez听到这首歌,心想:狼和羊如此和谐,为什么不尝试羊狼合养呢?说干就干! O ...
- bzoj 1412 [ZJOI2009]狼和羊的故事(最小割)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1412 [题意] 在一个n*m的格子中,将羊和狼隔开的最小代价. [思路] 最小割. 由 ...
- bzoj 1412: [ZJOI2009]狼和羊的故事
http://www.lydsy.com/JudgeOnline/problem.php?id=1412 超级源点连向所有的狼,超级汇点连向所有羊,流量为INF 相邻连边流量为1,最小割 #inclu ...
- 1412. [ZJOI2009]狼和羊的故事【最小割】
Description “狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......” Orez听到这首歌,心想:狼和羊如此和谐,为什么不尝试羊狼合养呢?说干就干! O ...
- 1412: [ZJOI2009]狼和羊的故事
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4017 Solved: 2037[Submit][Status][Discuss] Descript ...
- 【bzoj1412】[ZJOI2009]狼和羊的故事 网络流最小割
题目描述 “狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......” Orez听到这首歌,心想:狼和羊如此和谐,为什么不尝试羊狼合养呢?说干就干! Orez的羊狼圈 ...
- 洛谷$P2598\ [ZJOI2009]$狼和羊的故事 网络流
正解:网络流 解题报告: 传送门! 昂显然考虑最小割鸭$QwQ$,就考虑说每个土地要么属于羊要么属于狼,然后如果一条边上是栅栏一定是相邻两边所属不同. 所以考虑给所有羊向$S$连$inf$,所有狼向$ ...
- bzoj1412: [ZJOI2009]狼和羊的故事
空地之间开始没有连然后一直WA...题意混乱...尴尬. #include<cstdio> #include<cstring> #include<iostream> ...
随机推荐
- spark-windows(含eclipse配置)下本地开发环境搭建
spark-windows(含eclipse配置)下本地开发环境搭建 >>>>>>注意:这里忽略JDK的安装,JDK要求是1.8及以上版本,请通过 java ...
- 20155237 《JAVA程序设计》实验三(敏捷开发与XP实践)实验报告
20155237 <JAVA程序设计>实验三(敏捷开发与XP实践)实验报告 实验内容 敏捷开发与XP实践 XP基础 XP核心实践 相关工具 实验要求 1.没有Linux基础的同学建议先学习 ...
- 20155302《网络对抗》Exp6 信息收集与漏洞扫描
20155302<网络对抗>Exp6 信息收集与漏洞扫描 实验内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测 ...
- 汇编 REPNE/REPNZ指令,SCASW指令,SCASD指令,SCAS指令
知识点: REPNE/REPNZ 指令 SCASW 指令 SCASD 指令 SCAS 指令 一.SCASW 指令 //SCASB cmp word ptr [edi],al //对标志位的影响 ...
- 汇编 sub减法指令 比较指令CMP JZ条件跳转指令
二.SUB指令 减法指令SUB (SUBtract) 格式: SUB A,B //A=A-B; 功能: 两个操作数的相减,即从A中减去B,其结果放在A中. 二.CMP 和JZ 指令 比较指令CMP 格 ...
- python 回溯法 子集树模板 系列 —— 11、全排列
问题 实现 'a', 'b', 'c', 'd' 四个元素的全排列. 分析 这个问题可以直接套用排列树模板. 不过本文使用子集树模板.分析如下: 一个解x就是n个元素的一种排列,显然,解x的长度是固定 ...
- Nuxt 开发 - 项目初始化
Nuxt是基于Vue的一个应用框架,采用服务端渲染(SSR),可以让用户的Vue单页面应用(SPA)也可以有利于SEO. 项目初始化 参考:https://zh.nuxtjs.org/guide/in ...
- AppStore下载Xcode的文件
有的时候团队开发,手机系统一升级,那么对应的Xcode也就需要升级了,由于团队开发,可能一下要把所有人的都升级一下,那么最简单的就是下好一份Xcode然后分享给大家. 但是有的时候你就会发现,通过Ap ...
- kubernetes部署mysql
第一章 部署K8S集群 https://www.cnblogs.com/zoulixiang/p/9504324.html 第二章 1.新建mysql-rc.yaml vi mysql-rc.yaml ...
- leetcode刷题笔记172 阶乘后的零
题目描述: 给定一个整数 n,返回 n! 结果尾数中零的数量. 示例1: 输入: 输出: 解释: ! = , 尾数中没有零. 示例2: 输入: 输出: 解释: ! = , 尾数中有 个零. 说明: 你 ...