[BeiJing2006]狼抓兔子 dijkstra+平面图最小割
一眼裸的最大流求最小割,然而数据范围过大,跑不下来。
我们可以将平面图转成对偶图,并进行连边。
这样,每条边的长度就对应原图中的割边长度。
起点到终点的最短路即为最小割。
别用SPFA,会死的很惨
Code:
#include<vector>
#include<queue>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<iostream>
#define U(i) ((i-1)<<1)|1
#define D(i) (i<<1)
using namespace std;
void SetIO(string a){
string in=a+".in",out=a+".out";
freopen(in.c_str(),"r",stdin);
freopen(out.c_str(),"w",stdout);
}
int s,t,n,m;
const int maxn=6000000+4;
int head[maxn],to[maxn],nex[maxn],val[maxn],edges,idx[1103][1103];
void add_edge(int u,int v,int c){
nex[++edges]=head[u], head[u]=edges, to[edges]=v, val[edges]=c;
} void build_row(int i,int j,int k){
if(i==1)add_edge(s,U(idx[i][j]),k);
else if(i==n) add_edge(D(idx[i-1][j]),t,k);
else add_edge(D(idx[i-1][j]),U(idx[i][j]),k),add_edge(U(idx[i][j]),D(idx[i-1][j]),k);
}
void build_col(int i,int j,int k){
if(j==1)add_edge(D(idx[i][j]),t,k);
else if(j==m) add_edge(s,U(idx[i][j-1]),k);
else add_edge(D(idx[i][j]),U(idx[i][j-1]),k),add_edge(U(idx[i][j-1]),D(idx[i][j]),k);
}
void build_cross(int i,int j,int k){
add_edge(U(idx[i][j]),D(idx[i][j]),k);
add_edge(D(idx[i][j]),U(idx[i][j]),k);
} long long d[maxn];
struct cmp{
bool operator()(int a,int b){
return d[a]>d[b];
}
};
priority_queue<long long ,vector<long long>,cmp>Q;
long long dijkstra()
{
bool done[maxn];
memset(done,false,sizeof(done));
memset(d,0x3f,sizeof(d));
d[s]=0;
Q.push(s);
while(!Q.empty())
{
int u=Q.top();
Q.pop();
if(done[u])continue;
done[u]=1;
if(u==t) break;
for(int v=head[u];v;v=nex[v])
if(d[u]+val[v]<d[to[v]])
{
d[to[v]]=d[u]+val[v];
Q.push(to[v]);
}
}
return d[t];
} int main(){
SetIO("input");
scanf("%d%d",&n,&m);
s=0,t=((n*m)<<1)+6666;
int cur=0,cost=0;
for(int i=1;i<n;++i)
for(int j=1;j<m;++j) idx[i][j]=++cur;
for(int i=1;i<=n;++i)
for(int j=1;j<m;++j){
scanf("%d",&cost);
build_row(i,j,cost);
} for(int i=1;i<n;++i)
for(int j=1;j<=m;++j){
scanf("%d",&cost);
build_col(i,j,cost);
} for(int i=1;i<n;++i)
for(int j=1;j<m;++j){
scanf("%d",&cost);
build_cross(i,j,cost);
}
printf("%lld",dijkstra());
return 0;
}
---恢复内容结束---
[BeiJing2006]狼抓兔子 dijkstra+平面图最小割的更多相关文章
- BZOJ1001 [BeiJing2006]狼抓兔子(平面图最小割转最短路)
..和HDU3870类似..注意n=1和m=1的情况. #include<cstdio> #include<cstring> #include<queue> #in ...
- BZOJ1001 BeiJing2006 狼抓兔子 【网络流-最小割】*
BZOJ1001 BeiJing2006 狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较 ...
- 【Bzoj】1001狼抓兔子(平面图最小割转对偶图最短路)
YEAH 题目链接 终于做对这道题啦 建图的艰辛难以言表- - 顺便说一句我队列转STL啦 狼抓兔子的地图符合平面图定义,于是将该图转成对偶图并求出对偶图的最短路即可. 这篇博客给了我极大的帮助 ...
- 【BZOJ1001】狼抓兔子(平面图最小割转最短路)
题意:有一张平面图,求它的最小割.N,M.表示网格的大小,N,M均小于等于1000. 左上角点为(1,1),右下角点为(N,M).有以下三种类型的道路 1:(x,y)<==>(x+1,y ...
- BZOJ 1001 [BeiJing2006] 狼抓兔子(平面图最大流)
题目大意 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的.而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: ...
- BZOJ 1001 狼抓兔子 (网络流最小割/平面图的对偶图的最短路)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 算法讨论: 1.可以用最大流做,最大流等于最小割. 2.可以把这个图转化其对偶图,然 ...
- 【bzoi2006】【狼抓兔子】【最小割】
Description Source: Beijing2006 [BJOI2006] 八中OJ上本题链接:http://www.lydsy.com/JudgeOnline/problem.php?id ...
- _bzoj1001 [BeiJing2006]狼抓兔子【平面图】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 顺便推荐一个ppt,里面有对平面图的介绍:浅析最大最小定理在信息学竞赛中的应用. 这里 ...
- [BZOJ1001][BeiJing2006]狼抓兔子(最小割转最短路|平面图转对偶图)
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 31805 Solved: 8494[Submit][ ...
随机推荐
- innobackupex: Error: --decompress requires qpress
数据库版本:5.6.16系统版本:cenos 6.5通过percona-xtranbackup恢复数据库报错(软件版本:percona-xtrabackup-2.1.9-744.rhel6.x8 ...
- poj 2762 Going from u to v or from v to u? 【 强连通 拓扑排序】
给出n个点,m条边,问是否任意两点u,v,是否满足u能够到达v,或者v能够到达u 自己写的时候以为缩一下点,然后再判断一下能不能拓扑排序就可以了 但是--wa--- 后来看了这篇题解 http://e ...
- IPv6地址分配
- 伍、ajax
一.ajax的概念 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 传统的网页(不使用 AJAX)如果需要更新 ...
- post数据html数据获取危险处理办法
基础小知识 ValidateRequest属性是Page类中比较常用的属性,用来指示是否对输入数据进行潜在危险性检查.在默认情况下为True,就是表示 “是对输入的数据进行潜在危险性检查”,这个属 ...
- (2)RDD的基本操作
一.map操作,map(Transform) 二.collect操作,collect(Action) 三.使用PairRDD来做计算,类似key-value结构 采用groupByKey来.将资料按照 ...
- [AtCoder Grand Contest 024 Problem E]Sequence Growing Hard
题目大意:考虑 N +1 个数组 {A0,A1,…,AN}.其中 Ai 的长度是 i,Ai 内的所有数字都在 1 到 K 之间. Ai−1 是 Ai 的子序列,即 Ai 删一个数字可以得到 Ai−1. ...
- [NOIPlus]斗地主
毫无意义的一道题. 用pai[i]表示某种点数的牌的剩余量,used[i]表示单,对,三,四的出牌数,大力分类讨论,大力dfs即可...真奇葩... #include <iostream> ...
- [读书笔记] R语言实战 (二) 创建数据集
R中的数据结构:标量,向量,数组,数据框,列表 1. 向量:储存数值型,字符型,或者逻辑型数据的一维数组,用c()创建 ** R中没有标量,标量以单元素向量的形式出现 2. 矩阵:二维数组,和向量一 ...
- [学习笔记] CS131 Computer Vision: Foundations and Applications:Lecture 9 深度学习
深度学习 So far this week Edge detection RANSAC SIFT K-Means Linear classifier Mean-shift PCA/Eigenfaces ...