BZOJ1001 洛谷4001 [BJOI2006]狼抓兔子 题解
这个题目有多种解法,这个题也是一个比较经典的题了,正是因为他的多样的做法,这个题主要难在建图和优化,因为这是一个网格图,所以spfa肯定过不去,所以用最短路解法的话,只能用dij,而网络流也是要加上几个必不可少的优化,具体在代码中解释:
代码:
// luogu-judger-enable-o2
#include <bits/stdc++.h>
#define M 6000100
#define N 200100
#define inf 1 << 30
using namespace std;
queue <int> q;
struct cym {
int to, next, len;
}e[M * ];
int lin[M * ], cnt = ;
int n, m, s, t, deep[M];
inline void add(int u, int v, int w)
{
e[++cnt].to = v;
e[cnt].len = w;
e[cnt].next = lin[u];
lin[u] = cnt;
}
inline bool bfs()
{
int i, now;
memset(deep, ,sizeof(deep));
q.push(s);
deep[s] = ;
while(!q.empty())
{
int now = q.front();
q.pop();
for(int i = lin[now]; i; i = e[i].next)
{
if(e[i].len && !deep[e[i].to])
{
deep[e[i].to] = deep[now] + ;
q.push(e[i].to);
}
}
}
if(deep[t] > )
return ;
return ;
}
int dfs(int x, int maxflow)//maxflow是当前最多可以流多少流量
{
if(x == t || maxflow == )
return maxflow;
int w, used = ;
for(int i = lin[x]; i; i = e[i].next)
{
if(deep[e[i].to] == deep[x] + && e[i].len)
{
w = dfs(e[i].to, min(maxflow - used, e[i].len));//w=这条边权的最小值或当前最多可以流的流量减去当前增广的流量
if(!w)//如果当前不能走了,就把这条路封掉,封掉的方法就是把层数设为0
{
deep[e[i].to] = ;
continue;
}
used += w;//当前可以流的流量
e[i].len -= w;
e[i ^ ].len += w;
if(used == maxflow)//相当于当前用光了 ,没有可以增广的流量了
return used;
}
}
if(!used)//used 是现在可以增广的流量
deep[x] = ;
return used;
}
int dinic()
{
int ans = ;
while(bfs())
{
ans += dfs(s, inf);
}
return ans;
}
inline int read() {
char ch = getchar(); int x = , f = ;
while(ch < '' || ch > '') {
if(ch == '-') f = -;
ch = getchar();
} while('' <= ch && ch <= '') {
x = x * + ch - '';
ch = getchar();
} return x * f;
}
int main()
{
n = read(), m = read();
s = , t = n * m;
for (int i = ; i <= n; i++)
for (int j = ; j < m; j++)
{
int w;
w = read();
add ( (i - ) * m + j, (i - ) * m + j + , w);
add ( (i - ) * m + j + , (i - ) * m + j, w);
}
for (int i = ; i < n; i++)
for (int j = ; j <= m; j++)
{
int w;
w = read();
add ( (i - ) * m + j, (i - ) * m + j + m, w);
add ( (i - ) * m + j + m, (i - ) * m + j, w);
}
for (int i = ; i < n; i++)
for (int j = ; j < m; j++)
{
int w;
w = read();
add ( (i - ) * m + j, (i - ) * m + j + m + , w);
add ( (i - ) * m + j + m + , (i - ) * m + j, w);
}
/*
for(int i = 1; i <= cnt; i++)
{
printf("%d %d %d\n", e[i].to, e[i].len, e[i].next);
}*/
printf("%d", dinic());
return ;
}
BZOJ1001 洛谷4001 [BJOI2006]狼抓兔子 题解的更多相关文章
- BZOJ1001或洛谷4001 [BJOI2006]狼抓兔子
BZOJ原题链接 洛谷原题链接 显然就是求最小割. 而对于一个平面图有结论,最大流=最小割=对偶图最短路. 所以这题可用最大流或是转换为对偶图求最短路,这里我是用的对偶图. 虽然理论上按上界算,这题\ ...
- [洛谷P4001][BJOI2006]狼抓兔子
题目大意:给你一个n*m的网格图,有三种边,横的,纵的和斜的,要你求出它的最小割 题解:网络流 卡点:1.无向图,反向弧容量应和正向弧相同 C++ Code: #include<cstdio&g ...
- 洛谷P4001 [BJOI2006]狼抓兔子(平面图转对偶图)
传送门 明明只要最小割加点优化就能过的东西…… 然而我偏偏要去学平面图转对偶图结果发现课件关键地方看不清->这里 而且建图累的半死…… 说实话只要最大流建图的时候反向边直接设为当前边容量再加个当 ...
- Luogu 4001 [BJOI2006]狼抓兔子
BZOJ 1001…… 并不会这个trick,所以笔记要详细一点. 前置知识 : 平面图转对偶图 传送门 听说直接$Dinic$就好了,还跑得比正解快…… 首先我们按照平面图的定义,把网格图中所 ...
- P4001 [BJOI2006]狼抓兔子(对偶图)
P4001 [BJOI2006]狼抓兔子 最短路+对偶图 看这题最容易想到的就是网络流.Dinic可以过,据说还跑得比正解快. 如果不写网络流,那么需要知道2个前置知识:平面图和对偶图(右转baidu ...
- 【bzoj1001】【最短路】【对偶图】【最大流转最小割】狼抓兔子题解
[BZOJ1001]狼抓兔子 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 18872 Solved ...
- BJOI2006狼抓兔子
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 9967 Solved: 2267[Submit][S ...
- BZOJ1001 BJOI2006 狼抓兔子
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个 ...
- 752. [BJOI2006] 狼抓兔子
★★★ 输入文件:bjrabbit.in 输出文件:bjrabbit.out 简单对比时间限制:1 s 内存限制:162 MB Description Source: Beijin ...
随机推荐
- 第一次在新西兰组织技术社区活动:Monkeyfest2018
从3月份登陆到现在,转眼间已经8个月了.在6个月的时候我就想写篇文总结下近期的一些状况,一直拖到现在.因为近期一直在筹备我第一次社区活动——Monkeyfest 2018,占用了比较多的时间.这是一个 ...
- Ubuntu: 软件库(software repositories)
Linux 生态下,几乎每个发行版都有自己的软件库(software repositories),Ubuntu 当然也不例外.Ubuntu 提供了四个不同的软件库,分别是 main.restricte ...
- Navicat还原出现Finished - Stopped before completion的问题
查看数据库中最大的单个文件容量 SHOW VARIABLES LIKE '%max_allowed_packet%'; 设置最大单个文件容量为10M,单次有效(新建查询---运行) SET GLO ...
- Django restful 规范
一.REST Frame Work REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为"表征状态转移&q ...
- 三、Object 对象常用操作方法
Object 构造方法 一.asign vs 扩展运算符 ... 1.共同点:都是浅拷贝 2.开发推荐 扩展运算符... let obj={ name: 'Tom', age: 18 }; let o ...
- react双组件传值和传参
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- [转帖] bat方式遍历目录内的文件
https://blog.csdn.net/qq_34924407/article/details/82781956 知识挺好用的 学习一下. #所有文件,包括子目录下的文件 @echo offcd ...
- Linux 下面RPM 安装的SQLSERVER 修改字符集的方法
1. 自己还是太low 2. 遇到问题 先 -h 处理 3. 发现登录报错, 怀疑是字符集的问题: 4. 计划是修改字符集 到 自己的环境可用的状态 使用命令 /opt/mssql/bin/mssql ...
- python设计模式第五天【单例模式】
1. 定义 一个类只有一个实例,提供访问该实例的全局方法 2.应用场景 (1)多线程之间共享对象资源 (2)整个程序空间中的全局变量,共享资源 (3)大规模程序的节省创建对象的时间 3.代码实现(使用 ...
- java构造器和构建器
本文摘自:https://blog.csdn.net/wh2827991/article/details/79013115 在实例化一个类的过程中,通常会遇到多个参数的构造函数,但如果有些参数是非必需 ...