BZOJ1001:狼抓兔子(最小割最大流+vector模板)
1001: [BeiJing2006]狼抓兔子
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
HINT
2015.4.16新加数据一组,可能会卡掉从前可以过的程序。
题解:
这题就是一个最小割最大流定理应用的模板题,最后跑个最大流就好了...我这里用的Dinic算法,其精髓就是dfs可多条路同时增广,一开始用vector谜之爆内存,所以改为前向星。
注意一下当前弧优化,很有用的一个优化。
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
#define INF 0x3f3f3f
using namespace std; const int N = ,M = ;
struct Edge{
int v,c,next;
}e[M];
int head[N],d[N],cur[N];
int n,m,tot=;
void adde(int u,int v,int w){
e[tot].v=v;e[tot].c=w;e[tot].next=head[u];head[u]=tot++;
e[tot].v=u;e[tot].c=w;e[tot].next=head[v];head[v]=tot++;
}
bool bfs(int s,int t){
queue<int> q;
memset(d,,sizeof(d));d[s]=;
q.push(s);
while(!q.empty()){
int u=q.front();q.pop();
for(int i=head[u];i!=-;i=e[i].next){
int v=e[i].v;
if(!d[v] && e[i].c>){
d[v]=d[u]+;
q.push(v);
}
}
}
return d[t]!=;
}
int dfs(int s,int a){
if(s==n*m || a==) return a;
int flow=,f;
for(int &i=cur[s];i!=-;i=e[i].next){
int v=e[i].v;
if(d[v]!=d[s]+) continue ;
f=dfs(v,min(a,e[i].c));
if(f>){
e[i].c-=f;
e[i^].c+=f;
flow+=f;
a-=f;
if(a==) break;
}
}
if(!flow) d[s]=-;
return flow;
}
int Dinic(){
int ans = ;
while(bfs(,n*m)){
for(int i=;i<=n*m;i++) cur[i]=head[i];
ans+=dfs(,INF);
}
return ans;
}
int main(){
scanf("%d%d",&n,&m);
int w;
memset(head,-,sizeof(head));
for(int i=;i<=n;i++){
for(int j=;j<=m-;j++){
scanf("%d",&w);
adde(m*(i-)+j,m*(i-)+j+,w);
}
}
for(int i=;i<=n-;i++){
for(int j=;j<=m;j++){
scanf("%d",&w);
adde(j+(i-)*m,j+i*m,w);
}
}
for(int i=;i<=n-;i++){
for(int j=;j<=m-;j++){
scanf("%d",&w);
adde((i-)*m+j,i*m+j+,w);
}
}
cout<<Dinic();
return ;
}
vector写了也不能白写,附上模板吧...
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
#define INF 0x3f3f3f
using namespace std; const int N = ; struct Edge{
int u,v,flow,c;
}; vector <int > vec[N];
vector <Edge> edges;
int n,m;
int cur[N],d[N]; void adde(int u,int v,int w){
edges.push_back((Edge){u,v,,w});
edges.push_back((Edge){v,u,,w});
int m = edges.size();
vec[u].push_back(m-);
vec[v].push_back(m-);
}
bool bfs(int s,int t){
memset(d,,sizeof(d));d[s]=;
queue <int> q;
q.push(s);
while(!q.empty()){
int u = q.front();q.pop();
for(int i=;i<vec[u].size();i++){
Edge& E = edges[vec[u][i]];
if(!d[E.v] && E.c>E.flow){
q.push(E.v);
d[E.v]=d[u]+;
}
}
}
if(!d[t]) return false;
return true ;
}
int dfs(int s,int a){ //a 目前最小残量
if(s==n*m || a==) return a;
int flow=,f;
for(int& i=cur[s];i<vec[s].size();i++){
Edge &E = edges[vec[s][i]];
if(d[E.v]!=d[s]+) continue ;
f=dfs(E.v,min(E.c-E.flow,a));
if(f>){
edges[vec[s][i]].c-=f;
edges[vec[s][i]^].c+=f;
a-=f;
flow+=f;
if(a==) break ;
}
}
return flow;
}
int Dinic(){
int ans = ;
while(bfs(,n*m)){
memset(cur,,sizeof(cur));
ans+=dfs(,INF);
}
return ans ;
}
BZOJ1001:狼抓兔子(最小割最大流+vector模板)的更多相关文章
- [bzoj1001]狼抓兔子 最小割
题意概述:给出一张无向图,每条边有一个权值,割掉这条边代价为它的权值,求使起点不能到达终点的最小代价. 显然能看出这是个最小割嘛,然后最小割=最大流,建图的时候特殊处理一下再跑个最大流就好了. #in ...
- [BJOI2006][bzoj1001] 狼抓兔子 [最小割]
题面: 传送门 思路: 其实就是一道最小割的题目...... 我的写法加了两个优化,常数比较小,所以过掉了 一个是当前弧,一个是若当前点并不能流出去,那么标记dep为-1 听说正解是对偶图最短路?可以 ...
- BZOJ1001: [BeiJing2006]狼抓兔子 [最小割 | 对偶图+spfa]
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 19528 Solved: 4818[Submit][ ...
- bzoj1001: [BeiJing2006]狼抓兔子 -- 最小割
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Description 现在小朋友们最喜欢的"喜羊羊与灰太狼 ...
- BZOJ 1001 狼抓兔子 (最小割转化成最短路)
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 27715 Solved: 7134[Submit][ ...
- BZOJ1001[BeiJing2006]狼抓兔子最小割網絡流
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...
- BZOJ1001[BeiJing2006]狼抓兔子——最小割
题目描述 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: ...
- 【bzoj1001】[BeiJing2006]狼抓兔子 最小割+对偶图+最短路
题目描述 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: ...
- BZOJ1001 [BeiJing2006]狼抓兔子 最小割 对偶图 最短路
原文链接http://www.cnblogs.com/zhouzhendong/p/8686871.html 题目传送门 - BZOJ1001 题意 长成上面那样的网格图求最小割. $n,m\leq ...
随机推荐
- VC中编译出现error LNK2005:xx already defined in xxx.obj问题解决。
网上百度说是在.h头文件中定义了全局变量,然后其他文件包括了该头文件的原因. 解决方法如下: 点击项目配置->linker->General->Force file Output设置 ...
- (数据科学学习手札15)DBSCAN密度聚类法原理简介&Python与R的实现
DBSCAN算法是一种很典型的密度聚类法,它与K-means等只能对凸样本集进行聚类的算法不同,它也可以处理非凸集. 关于DBSCAN算法的原理,笔者觉得下面这篇写的甚是清楚练达,推荐大家阅读: ht ...
- python2.7练习小例子(二十九)
29):1.题目:按相反的顺序输出列表的值. #!/usr/bin/python # -*- coding: UTF-8 -*- a = ['one', 'two', 'three'] for ...
- linux的常用易忘命令
1.查看软件安装路径 [root@localhost ~]# which gcc /usr/bin/gcc 查询进程 ps -ef |grep redis 查看端口 netstat -lntp |g ...
- 初识Continuation
本文来自网易云社区 作者:陆艺 上学时看了SICP之后就对scheme这个看上去比较古怪的语言产生了兴趣. 虽然书里并没有涉及scheme太多语法以及语言上特性的一些东西, 作为一个喜欢折腾的人, 手 ...
- nginx https ssl 配置
#设置https 访问server { listen ; server_name www.xxx.com; access_log xxx/xxx/xxx.log combined; index ind ...
- Python 3基础教程28-内置函数
本文介绍Python中的内置函数,Python中有很多内置的,功能强大的函数,可以帮我们解决很多问题,有些方法,根本不需要你去再次编写实现函数,你直接调用就可以.在这之前,需要介绍下,如何在windo ...
- 并查集——poj1308(并查集延伸)
题目链接:Is It A Tree? 题意:给你一系列形如u v的点对(u v代表一条由u指向v的有向边),请问由给你的点构成的图是不是一棵树? 树的特征:①每个节点(除了根结点)只有一个入度:②只有 ...
- pta函数作业
7-10 设计思路:本题需要判断一个正整数数是否为素数,所谓素数,就是除一和本身外没有其他因数的数.具体判断过程如下:对于一个大于一的整数,从2开始用循环计数i去除此数,若余数不为零,则循环计数i自加 ...
- poi解析excel出现格式不正确
后缀为xlsx的excel做系统导入时出现bug: Strict OOXML isn't currently supported, please see bug #57699 为了同时兼容03.07及 ...