题目

这个题目有多种解法,这个题也是一个比较经典的题了,正是因为他的多样的做法,这个题主要难在建图和优化,因为这是一个网格图,所以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. docker配置阿里云镜像加速

    一.登录阿里云控制台,并打开镜像加速器页面,复制加速器地址 二.修改daemon配置文件/etc/docker/daemon.json ,将复制的地址按照如下格式写入文件,若存在多行,使用逗号分隔. ...

  2. hybrid App cordova打包webapp PhoneGap

    Hybrid APP基础篇(一)->什么是Hybrid App APP三种开发模式--之--HybridApp解决方案 Hybrid App开发 四大主流平台分析 Hybrid App 开发模式 ...

  3. 牛客练习赛38 D 出题人的手环

    链接 [https://ac.nowcoder.com/acm/contest/358/D] 题意 链接:https://ac.nowcoder.com/acm/contest/358/D 来源:牛客 ...

  4. 关于function和task的说明

    1.  关于函数function调用,总结两个要点: 1.  函数调用一般产生一个值,这个值被赋值给某个变量 2.  函数所返回的值只能是一个,不可以是多个,不能像C语言中采用指针的方式返回多个值.因 ...

  5. Django之时间的设置

    Django之时间的设置 在Django的配置文件 settings.py 中,有两个配置参数是跟时间与时区有关的,分别是 TIME_ZONE 和 USE_TZ. 如果USE_TZ设置为True时,D ...

  6. [编程笔记]第二章 C语言预备知识

    /*第二讲 C语言预备专业知识 1.CPU 内存条 硬盘 显卡 主板 显示器之间的关系 CPU不能直接处理硬盘上的数据 文件存储在硬盘,当运行时,操作系统把硬盘上的数据调用到内存条上. 图像以数据的形 ...

  7. YOLO.h5 下载

    链接:https://pan.baidu.com/s/1sTxkuaFWXqT4yXLHQ9BgUA 密码:ga0o fhwayd_w1231234asd><321$%

  8. day 7-18 mysql case when语句

    概述: sql语句中的case语句与高级语言中的switch语句,是标准sql的语法,适用于一个条件判断有多种值的情况下分别执行不同的操作. 首先,让我们看一下CASE的语法.在一般的SELECT中, ...

  9. hadoop的缺点

    Hadoop的限制 Hadoop只能执行批量处理,并且只以顺序方式访问数据.这意味着必须搜索整个数据集,即使是最简单的搜索工作.

  10. python爬虫之Gerapy安装部署

    原创北航大才:https://cuiqingcai.com/5006.html NULL:http://www.infosec-wiki.com/?p=432737