一眼裸的最大流求最小割,然而数据范围过大,跑不下来。

我们可以将平面图转成对偶图,并进行连边。

这样,每条边的长度就对应原图中的割边长度。

起点到终点的最短路即为最小割。

别用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+平面图最小割的更多相关文章

  1. BZOJ1001 [BeiJing2006]狼抓兔子(平面图最小割转最短路)

    ..和HDU3870类似..注意n=1和m=1的情况. #include<cstdio> #include<cstring> #include<queue> #in ...

  2. BZOJ1001 BeiJing2006 狼抓兔子 【网络流-最小割】*

    BZOJ1001 BeiJing2006 狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较 ...

  3. 【Bzoj】1001狼抓兔子(平面图最小割转对偶图最短路)

    YEAH 题目链接 终于做对这道题啦    建图的艰辛难以言表- - 顺便说一句我队列转STL啦 狼抓兔子的地图符合平面图定义,于是将该图转成对偶图并求出对偶图的最短路即可. 这篇博客给了我极大的帮助 ...

  4. 【BZOJ1001】狼抓兔子(平面图最小割转最短路)

    题意:有一张平面图,求它的最小割.N,M.表示网格的大小,N,M均小于等于1000. 左上角点为(1,1),右下角点为(N,M).有以下三种类型的道路  1:(x,y)<==>(x+1,y ...

  5. BZOJ 1001 [BeiJing2006] 狼抓兔子(平面图最大流)

    题目大意 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的.而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: ...

  6. BZOJ 1001 狼抓兔子 (网络流最小割/平面图的对偶图的最短路)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 算法讨论: 1.可以用最大流做,最大流等于最小割. 2.可以把这个图转化其对偶图,然 ...

  7. 【bzoi2006】【狼抓兔子】【最小割】

    Description Source: Beijing2006 [BJOI2006] 八中OJ上本题链接:http://www.lydsy.com/JudgeOnline/problem.php?id ...

  8. _bzoj1001 [BeiJing2006]狼抓兔子【平面图】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 顺便推荐一个ppt,里面有对平面图的介绍:浅析最大最小定理在信息学竞赛中的应用. 这里 ...

  9. [BZOJ1001][BeiJing2006]狼抓兔子(最小割转最短路|平面图转对偶图)

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 31805  Solved: 8494[Submit][ ...

随机推荐

  1. HDU 1052 Tian Ji -- The Horse Racing【贪心在动态规划中的运用】

    算法分析: 这个问题很显然可以转化成一个二分图最佳匹配的问题.把田忌的马放左边,把齐王的马放右边.田忌的马A和齐王的B之间,如果田忌的马胜,则连一条权为200的边:如果平局,则连一条权为0的边:如果输 ...

  2. Unity中 Animator 与Animation 区别

    ①Animation和Animator 虽然都是控制动画的播放,但是它们的用法和相关语法都是大有不同的.Animation 控制一个动画的播放,而Animator是多个动画之间相互切换,并且Anima ...

  3. Jquery 过滤器(first,last,not,even,odd)的使用和区别

    Jquery 过滤器主要有first,last,not,even,odd等等,它们分别表示: 代码如下: $(function(){ $("#menu li:first").cli ...

  4. 路飞学城Python-Day29(第四模块-并发编程)

    01-进程与程序的概念 并发:多进程和多线程 进程的概念:进程就是正在执行的过程,一个应用程序不是进程,只有应用程序启动以后才能说是进程,进程是一个抽象的概念,起源于操作系统 02-操作系统介绍 应用 ...

  5. jquery 终止循环

    jQuery中each类似于javascript的for循环 但不同于for循环的是在each里面不能使用break结束循环,也不能使用continue来结束本次循环,想要实现类似的功能就只能用ret ...

  6. Matplotlib 绘图与可视化 一些属性和错误

    属性 *)调整图像边缘及图像间的空白间隔plt.subplots.adjust(6个参数) 图像外部边缘的调整可以使用plt.tight_layout()进行自动控制,此方法不能够很好的控制图像间的间 ...

  7. n&(n-1)位运算的妙用

    一.n-1发生了什么 ①.二进制数n,n-1后,如果最后一位是0,将向前一位借2,2-1=1.最后一位为1.如果前一位为0,将继续向前一位借2,加上本身少掉的1.则变为1.一直遇到1.减为0. 所以 ...

  8. 接口测试及接口Jmeter工具介绍

    一.接口类型及数据传递的格式 接口类型: 1.HTTP接口:通过GET或POST来获取数据,在数据处理上效率比较高 2.WebServer接口:通过SOAP协议来获取数据,比起http来说处理更加复杂 ...

  9. 【codeforces 794A】Bank Robbery

    [题目链接]:http://codeforces.com/contest/794/problem/A [题意] 每个位置上可能有物品(>=1)或是没物品 你一开始在某一个位置b; 然后你最左可以 ...

  10. 主流框架(SSH及SSM)配置文件的模板头文件

    SSH三大框架整合配置头文件模板如下: 一:Spring配置文件(beans.xml)模板:<beans    xmlns="http://www.springframework.or ...