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 ...
随机推荐
- 腾讯招聘网数据爬取存入mongodb
#!/user/bin/env python3 # -*- coding: utf-8 -*- import requests from lxml import etree from math imp ...
- 自定义vim配置文件vimrc,用于c/c++编程
vim作为Linux下广受赞誉的代码编辑器,其独特的纯命令行操作模式可以很大程度上方便编程工作,通过自定义vim配置文件可以实现对vim功能的个性化设置. vim配置文件一般有两份,属于root的/e ...
- stm32+lwip(五):以太网帧发送测试
我是卓波,很高兴你来看我的博客. 系列文章: stm32+lwip(一):使用STM32CubeMX生成项目 stm32+lwip(二):UDP测试 stm32+lwip(三):TCP测试 stm32 ...
- centos 7 关闭IPtables
systemctl status iptables.service systemctl stopiptables.service
- 牛客网暑期ACM多校训练营(第四场) F
参考:http://www.cnblogs.com/Jadon97/p/9383027.html #include <iostream> #include <cstdio> # ...
- js数组长度
js数组长度,一般使用length 属性即可获取,但这个数组是个对象则只能使用以下方式 var t=typeof o; var length=0; if(t=='string'){ length=o. ...
- python2.7练习小例子(六)
6):题目:斐波那契数列. 程序分析:斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.……. ...
- kudu是什么
Apache Kudu Overview 建议配合[Apache Kudo]审阅本文(http://kudu.apache.org/overview.html) 数据模式 Kudo是一个列式存储的用于 ...
- 20145202马超《网络对抗》Exp3免杀 进阶
木马化正常软件,如通过改变机器指令.实现可免杀免防火墙提示的后门. 继上次实验3所做的代码在主函数里面加上一行调用就可以 改各种属性,这里我参考了郝浩同学的博客 最后我还是遇到了问题 后来发现虽然有那 ...
- LeetCode 29——两数相除
1. 题目 2. 解答 2.1. 方法一 题目要求不能使用乘法.除法和除余运算,但我们可以将除法转移到对数域. \[ \frac{a}{b} = e^{\frac{lna}{lnb}} = e^{ln ...