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> ...
随机推荐
- 【H5】直接拨打电话
一般<a href="tel:400-663-5999">400-663-5999</a>实现. 而形如<a href="tel:*9204 ...
- 关于this指向,翻到的
关于JavaScript函数执行环境的过程,IBM developerworks文档库中的一段描述感觉很不错,摘抄如下: “JavaScript 中的函数既可以被当作普通函数执行,也可以作为对象的方法 ...
- CLR回收非托管资源
一.非托管资源 在<垃圾回收算法之引用计数算法>.<垃圾回收算法之引用跟踪算法>和<垃圾回收算法之引用跟踪算法>这3篇文章中,我们介绍了垃圾回收的一些基本概念和原理 ...
- LORA---关于LORA的30个常见问题解答
1) 什么是LoRa调制? LoRa (Long Range,远距离)是一种调制技术,与同类技术相比,提供更长的通信距离.调制是基于扩频技术,线性调制扩频(CSS)的一个变种,具有前向纠错(FEC). ...
- js中的数据类型及判断方法
ECMAScirpt 变量有两种不同的数据类型:基本类型,引用类型. 基本类型 ● Boolean ● Null ● Undefined ● Number ● String ● Symbol (ECM ...
- fis入门-单文件编译之文件优化(optimize)
FIS(Front-end Integrated Solution ),是百度的前端集成解决方案.最近几天在研究前端构建的东西,就顺便了解了下,果断各种高大上,可以到FIS官网围观感受一下.如果对fi ...
- First day for introducing me
""" This is first python3 script code for lyp in Bokeyuan __author__="lyp" ...
- 小刘的机器学习---SVM
前言: 这是一篇记录小刘学习机器学习过程的随笔. 正文: 支持向量机(SVM)是一组用于分类, 回归和异常值检测的监督学习方法. 在分类问题中,SVM就是要找到一个同时离各个类别尽可能远的决策边界即最 ...
- npm安装时一些错误
1. npm install 提示no such file or directory 缺少package.json 首先初始化, npm init -f 然后安装依赖 npm install form ...
- [T-ARA][O My God]
歌词来源:http://music.163.com/#/song?id=22704432 눈을 뜨면 생각이나고 길을 걷다 생각이나고 [nu-neul ddeu-myeon saeng-ga-gi ...