BZOJ1001 狼抓兔子(裸网络流)
Description

Input
Output
输出一个整数,表示参与伏击的狼的最小数量.
Sample Input
5 6 4
4 3 1
7 5 3
5 6 7 8
8 7 6 5
5 5 5
6 6 6
Sample Output
正解:Dinic(裸网络流)
解题报告:
大概题意是给一个网格图,然后横向、竖向、斜向都有边相连,然后问图的最小割
上网查满地跑的对偶图,然后学了一下对偶图,但并不打算用转对偶图,尽管好像很简单
于是试图用Dicnic强上,直接把每条边连进去,暴力网络流。
就当网络流练手题吧。
值得一提的是,需要用一些优化不然会TLE:当发现拓展到当前的结点发现可拓展流量为0,那么这个点在这下一次重新BFS建分层图时显然不会再用的上(画个图yy一下就可以了) 所以直接dis[now]=-1,相当于把它“堵塞”住了。
//It is made by jump~
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#ifdef WIN32
#define OT "%I64d"
#else
#define OT "%lld"
#endif
using namespace std;
typedef long long LL;
const int MAXM = ;
const int MAXN = ;
int inf;
int n,m;
int first[MAXN];
int ecnt;
int s,t;
int dis[MAXN];
int ans; struct edge{
int v,f;
int next;
}e[MAXM]; inline int getint()
{
int w=,q=;
char c=getchar();
while((c<'' || c>'') && c!='-') c=getchar();
if (c=='-') q=, c=getchar();
while (c>='' && c<='') w=w*+c-'', c=getchar();
return q ? -w : w;
} inline void link(int x,int y,int z){
e[++ecnt].next=first[x]; first[x]=ecnt; e[ecnt].v=y; e[ecnt].f=z;
e[++ecnt].next=first[y]; first[y]=ecnt; e[ecnt].v=x; e[ecnt].f=z;
} inline bool bfs(){
memset(dis,/,sizeof(dis));
int cun=dis[t];
queue<int>Q;
while(!Q.empty()) Q.pop(); dis[]=; Q.push();
while(!Q.empty()) {
int u=Q.front(); Q.pop();
for(int i=first[u];i;i=e[i].next) {
if(e[i].f && dis[e[i].v]==cun) {
dis[e[i].v]=dis[u]+; Q.push(e[i].v);
}
}
if(dis[t]!=cun) return true;
} return false;
} inline int maxflow(int now,int remain){
if(remain== || now==t) return remain;
int flow=;
for(int i=first[now];i;i=e[i].next){
if(dis[e[i].v]==dis[now]+ && e[i].f){
int f=maxflow(e[i].v,min(remain,e[i].f));
if(f) {
e[i].f-=f; e[i^].f+=f;
flow+=f; remain-=f;
if(remain==) return flow;
}
else dis[e[i].v]=-;
}
}
return flow;
} inline void solve(){
s=,t=n*m; inf=;
for(int i=;i<=;i++) inf*=;
while(bfs()) {
ans+=maxflow(s,inf);
}
printf("%d",ans);
} int main()
{
n=getint(); m=getint(); int x; ecnt=;
int nowx,nownex;
for(int i=;i<=n;i++)
for(int j=;j<m;j++){
nowx=(i-)*m+j,nownex=nowx+;
x=getint(); link(nowx,nownex,x);
} for(int i=;i<n;i++)
for(int j=;j<=m;j++) {
nowx=(i-)*m+j,nownex=nowx+m;
x=getint(); link(nowx,nownex,x);
} for(int i=;i<n;i++)
for(int j=;j<m;j++) {
nowx=(i-)*m+j,nownex=nowx+m+;
x=getint(); link(nowx,nownex,x);
} solve();
return ;
}
BZOJ1001 狼抓兔子(裸网络流)的更多相关文章
- 【BZOJ1001】狼抓兔子(网络流)
[BZOJ1001]狼抓兔子(网络流) 题面 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨, ...
- bzoj1001狼抓兔子 对偶图优化
bzoj1001狼抓兔子 对偶图优化 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1001 思路 菜鸡总是要填坑的! 很明显让你求网格图的最 ...
- BZOJ1001 BeiJing2006 狼抓兔子 【网络流-最小割】*
BZOJ1001 BeiJing2006 狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较 ...
- [bzoj1001][BeiJing2006]狼抓兔子_网络流_最小割转对偶图
狼抓兔子 bzoj-1001 BeiJing2006 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还 ...
- BZOJ-1001 狼抓兔子 (最小割-最大流)平面图转对偶图+SPFA
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 14686 Solved: 3513 [Submit][ ...
- bzoj1001狼抓兔子
1001: [BeiJing2006]狼抓兔子 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你 ...
- BZOJ1001:狼抓兔子(最小割最大流+vector模板)
1001: [BeiJing2006]狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨, ...
- 【建图+最短路】Bzoj1001 狼抓兔子
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个 ...
- [BJOI2006]狼抓兔子(网络流)
题目描述 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: ...
随机推荐
- 关于ZeroMQ的信息与文档
1. 官方文档(英文,很长) http://zguide.zeromq.org/page:all 2. 云风的关于 http://blog.codingnow.com/2011/02/zeromq_m ...
- Gerrit日常操作命令收集
Gerrit代码审核工具是个好东西,尤其是在和Gitlab和Jenkins对接后,在代码控制方面有着无与伦比的优势. 在公司线上部署了一套Gerrit系统,在日常运维中,使用了很多gerrit命令,在 ...
- 10Spring_AOP编程(传统编程)
注意我写这篇文章的思路,要想做切面编程,包含两个部分,通知和切点,通知是你要做哪些增强,切点是指你要拦截哪些方法.先介绍通知的定义再去介绍切点的定义.这篇文章我取名叫做Spring_AOP编程(传统编 ...
- Android开发eclipse运行程序时报timeout的解决方法
eclipse开发Android程序时,忽然莫名其妙报这个错,之前还好好的.忽然就不行了. Failed to install xxx.apk on device~~~: timeout 尝试过手机里 ...
- Protocol Buffer多态
java中有多态的概念,protobuf本身没有多态的概念,但是它有一个扩展的概念. 以聊天消息为例,先看下面这个类图,基类是ChatMessage,子类TextMessage和ImageMessag ...
- Linux 网络编程四(socket多线程升级版)
//网络编程--客户端 #include <stdio.h> #include <stdlib.h> #include <string.h> #include &l ...
- C语言 常用的时间函数
//时间函数的使用 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include& ...
- 用python简单处理图片(5):图像直方图
我们先来看两个函数reshape和flatten: 假设我们先生成一个一维数组: vec=np.arange(15) print vec 显示为: [ 0 1 2 3 4 5 6 7 8 9 10 1 ...
- 更简单地进行Auto Layout--SnapKit 支持swift
OC下的autolayout神器Masonry大家已经很熟悉了.但是masonry在swift下使用并不方便.所以同一个团队开发出了swift下的autolayout库:SnapKitsnapkit从 ...
- 20145302张薇 GDB调试汇编堆栈过程分析
GDB堆栈跟踪与汇编调试 堆栈跟踪 源代码 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器 ...