题目

这个题目有多种解法,这个题也是一个比较经典的题了,正是因为他的多样的做法,这个题主要难在建图和优化,因为这是一个网格图,所以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. MapReduce中map并行度优化及源码分析

    mapTask并行度的决定机制 一个job的map阶段并行度由客户端在提交job时决定,而客户端对map阶段并行度的规划的基本逻辑为:将待处理数据执行逻辑切片(即按照一个特定切片大小,将待处理数据划分 ...

  2. Linux查看端口

    1.lsof -i:端口号 用于查看某一端口的占用情况,比如查看8000端口使用情况,lsof -i:8000   2.netstat -tunlp |grep 端口号 用于查看指定的端口号的进程情况 ...

  3. super关键字访问父类成员

    1.super只能出现在子类的方法和构造方法中: 2.super调用构造方法时只能是第一句: 3.super不能访问父类的private成员.

  4. A4纸尺寸 web打印报告

    A4纸对应的像素尺寸: <style> @media print { .Noprn{ display:none;} .print-hidden { display: none !impor ...

  5. ImageProcessor组件

    ImageProcessor组件 开源免费的.NET图像即时处理的组件ImageProcessor   承接以前的组件系列,这个组件系列旨在介绍.NET相关的组件,让大家可以在项目中有一个更好的选择, ...

  6. windows下linux子系统安装

    1.打开Windows功能中的使用于linux的Windows子系统 2.应用商店中下载需要的linux 3.下载完成后运行等待安装并输入用户名密码  4.查看系统信息 先后 sudo apt-get ...

  7. react插件包

    react-scoped-style support ie8,ie8+,chrome,firefox,safari does not support css priority (just apply ...

  8. Java 找不到或者无法加载主类

    1 测试Test 类的时候突然遇到一个很奇怪的问题,网上搜了很多资料才找到解决办法,大多数情况是因为类加了包名编译,执行的时候没有到包下去执行.与我遇到的情况不一样. 问题:写了一个测试类Test,在 ...

  9. 13 Connectors: show contrast/oppistion

    1 "but" 和 "yet" 用来显示两个意思之间的对比关系.在写作中,当 "but" 和"yet" 将两个分句连为一 ...

  10. [转帖] SS, SP, BP 三个寄存器

    SS, SP, BP 三个寄存器 https://blog.csdn.net/vspiders/article/details/55669265 这么看 计算机组成原理 还有 考试的很多题目非常有用啊 ...