题目

这个题目有多种解法,这个题也是一个比较经典的题了,正是因为他的多样的做法,这个题主要难在建图和优化,因为这是一个网格图,所以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. 数据库(mysql)基本使用命令大全

    1.查看数据库及表属性: 1)查看所有数据库 SHOW DATABASES; 2)选择使用的数据库 USE <DATABASE_NAME> 3)查看当前数据库下面的表 SHOW TABLE ...

  2. 协程 IO多路复用

    -----------------------------------------------------------------试试并非受罪,问问并不吃亏.善于发问的人,知识丰富. # # ---- ...

  3. vue webpack打包 -webkit-box-orient 失效

    一行省略 overflow: hidden; white-space: nowrap; text-overflow: ellipsis; 超出两行省略 overflow: hidden; text-o ...

  4. 这款APP太像微信 腾讯起诉索赔1000万

    去年8月,“币应”(inChat)APP上线,号称是一款原创的区块链加密通讯工具,而界面与微信极为相似,图标是白配绿色调,内部界面几乎一模一样,通讯录.朋友圈的界面完全相同.里面的小游戏,也从微信拿来 ...

  5. 安装pandas时出现环境错误

    在安装pandas时出现Could not install packages due to an EnvironmentErrorConsider using the `--user` option ...

  6. 福州大学软件工程1816 | W班 第6次作业WordCount成绩排名

    作业链接 WordCount进阶需求 评分细则 本次个人项目分数由两部分组成(博客分满分40分+程序得分满分60分) 博客评分细则(满分60,最终折算为40分) 在文章开头给出结对同学的博客链接.本作 ...

  7. python3 selenium webdriver 元素定位xpath定位骚操作

    源文http://www.cnblogs.com/qingchunjun/p/4208159.html By.xpath() 这个方法是非常强大的元素查找方式,使用这种方法几乎可以定位到页面上的任意元 ...

  8. 【Java基础】for循环实现在控制台打印水仙花数

    代码: /* * 需求:在控制台输出所有的”水仙花数” * * 分析: * 什么是水仙花数呢? * 所谓的水仙花数是指一个三位数,其各位数字的立方和等于该数本身. * 举例:153就是一个水仙花数. ...

  9. spring初始化bean时执行某些方法完成特定的初始化操作

    在项目中经常会在容器启动时,完成特定的初始化操作,如资源文件的加载等. 一 实现的方式有三种: 1.使用@PostConstruct注解,该注解作用于void方法上 2.在配置文件中配置init-me ...

  10. laravel实现批量添加数据

    在使用laravel eloquent进行数据库操作的时候惊讶的发现这货居然不支持批量添加,看到网上很多人在循环里进行数据库插入操作来实现批量添加,我想说这样做是很损失性能滴!好在框架的DB门面里的i ...