题目

这个题目有多种解法,这个题也是一个比较经典的题了,正是因为他的多样的做法,这个题主要难在建图和优化,因为这是一个网格图,所以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]狼抓兔子 题解的更多相关文章

  1. BZOJ1001或洛谷4001 [BJOI2006]狼抓兔子

    BZOJ原题链接 洛谷原题链接 显然就是求最小割. 而对于一个平面图有结论,最大流=最小割=对偶图最短路. 所以这题可用最大流或是转换为对偶图求最短路,这里我是用的对偶图. 虽然理论上按上界算,这题\ ...

  2. [洛谷P4001][BJOI2006]狼抓兔子

    题目大意:给你一个n*m的网格图,有三种边,横的,纵的和斜的,要你求出它的最小割 题解:网络流 卡点:1.无向图,反向弧容量应和正向弧相同 C++ Code: #include<cstdio&g ...

  3. 洛谷P4001 [BJOI2006]狼抓兔子(平面图转对偶图)

    传送门 明明只要最小割加点优化就能过的东西…… 然而我偏偏要去学平面图转对偶图结果发现课件关键地方看不清->这里 而且建图累的半死…… 说实话只要最大流建图的时候反向边直接设为当前边容量再加个当 ...

  4. Luogu 4001 [BJOI2006]狼抓兔子

    BZOJ 1001…… 并不会这个trick,所以笔记要详细一点. 前置知识 : 平面图转对偶图    传送门 听说直接$Dinic$就好了,还跑得比正解快…… 首先我们按照平面图的定义,把网格图中所 ...

  5. P4001 [BJOI2006]狼抓兔子(对偶图)

    P4001 [BJOI2006]狼抓兔子 最短路+对偶图 看这题最容易想到的就是网络流.Dinic可以过,据说还跑得比正解快. 如果不写网络流,那么需要知道2个前置知识:平面图和对偶图(右转baidu ...

  6. 【bzoj1001】【最短路】【对偶图】【最大流转最小割】狼抓兔子题解

    [BZOJ1001]狼抓兔子 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 18872  Solved ...

  7. BJOI2006狼抓兔子

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 9967  Solved: 2267[Submit][S ...

  8. BZOJ1001 BJOI2006 狼抓兔子

    Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个 ...

  9. 752. [BJOI2006] 狼抓兔子

    ★★★   输入文件:bjrabbit.in   输出文件:bjrabbit.out   简单对比时间限制:1 s   内存限制:162 MB Description   Source: Beijin ...

随机推荐

  1. Python全栈开发之路 【第一篇】:Python 介绍

    本节内容 一.Python介绍 python的创始人为荷兰人——吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本 ...

  2. Python-递归初识-50

    #递归函数 # 了解什么是递归 : 在函数中调用自身函数 # 最大递归深度默认是997/998 —— 是python从内存角度出发做得限制 # 能看懂递归 # 能知道递归的应用场景 # 初识递归 —— ...

  3. Django restful 规范

    一.REST Frame Work REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为"表征状态转移&q ...

  4. windows 环境下 eclipse + maven + tomcat 的 hello world 创建和部署

    主要记录自己一个新手用 eclipse + maven + tomcat 搭建 hello world 的过程,以及遇到的问题.讲真都是自己通过百度和谷歌一步步搭建的项目,没问过高手,也没高手可问,由 ...

  5. awk+sed编程

  6. nginx 编译安装以及简单配置

    前言 Nginx的大名如雷贯耳,资料太多了,网上一搜一大把,所以这里就不阐述nginx的工作原理了,只是简单的编译安装nginx,然后呢,简单配置一下下. 下载Nginx.安装 下载地址:http:/ ...

  7. jmeter压测参数设定(转)

    jmeter压测参数设定 一.基本公式 线程数 = QPS * time: 注:QPS--每秒完成请求的个数:time--每个请求响应完成平均需要时间: 故QPS * time就是所有请求完成响应所需 ...

  8. React Native之通知栏消息提示(android)

    React Native之通知栏消息提示(android) 一,需求分析与概述 1.1,推送作为手机应用的基本功能,是手机应用的重要部分,如果自己实现一套推送系统费时费力,所以大部分的应用都会选择使用 ...

  9. VS2015 + OPENCV + CUDA 安装流程

    VS2015  https://blog.csdn.net/guxiaonuan/article/details/73775519?locationNum=2&fps=1 OPENCV htt ...

  10. Azure系列1.1.2 —— 用于 IntelliJ 的 Azure 工具包的登录说明

    (文中大部分内容(95%)Azure官网上有,我只是把我自己实际操作中遇到的问题在这里阐述一下.) 先决条件 若要完成文章中的步骤,需要安装用于 IntelliJ 的 Azure 工具包,该工具包需要 ...