BZOJ_1001_狼抓兔子(平面图求最小割+对偶图求最短路)

描述



http://www.lydsy.com/JudgeOnline/problem.php?id=1001

分析



平面图求最小割,转化成对偶图求最短路,经典.

注意:

1.优先队列是个大根堆.

2.Dijkstra可以带一个vis数组,也可以不带,因为一个点出来以后,它更新的的点和原本就在队列里的点都比它大,所以它不可能被更新得更小,之后这个点再出队时情况不比第一次更优,所以出队也不会有操作.

3.双向边,数组要开够(貌似不是第一次犯这个错误).

4.网上有人说m==1||n==1的情况可以不特判,在get函数中已经可以处理妥当,大丈夫.

#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;

const int maxn=1000+10,oo=1<<27;
int n,m,cnt;
int d[maxn*maxn*2],head[maxn*maxn*4];
bool vis[maxn*maxn*2];
struct edge{
    int to,w,next;
    edge(){}
    edge(int a,int b,int c):to(a),w(b),next(c){}
    bool operator<(const edge &a) const { return a.w<w; }
}g[maxn*maxn*6];
void insert(int from,int to,int w){
    g[++cnt]=edge(to,w,head[from]); head[from]=cnt;
    g[++cnt]=edge(from,w,head[to]); head[to]=cnt;
}

int get(int x,int y,int z){
    if(x<1||y>=m) return ((n-1)*(m-1)<<1)+1;
    if(x>=n||y<1) return 0;
    return (((x-1)*(m-1)+y-1)<<1)+z+1;
}
int Dijkstra(int s,int t){
    for(int i=0;i<=((n-1)*(m-1)<<1)+1;i++) d[i]=oo;
    d[s]=0;
    priority_queue <edge> q;
    q.push(edge(s,0,0));
    while(!q.empty()){
        edge e=q.top(); q.pop();
        int x=e.to;
        if(vis[x]) continue;
        vis[x]=true;
        for(int i=head[x];i;i=g[i].next){
            int y=g[i].to;
            if(d[y]>d[x]+g[i].w){
                d[y]=d[x]+g[i].w;
                q.push(edge(y,d[y],0));
            }
        }
    }
    return d[t];
}

void init(){
    for(int i=1;i<=n;i++){
        for(int j=1;j<m;j++){
            int a; scanf("%d",&a);
            insert(get(i,j,1),get(i-1,j,0),a);
        }
    }
    for(int i=1;i<n;i++){
        for(int j=1;j<=m;j++){
            int a; scanf("%d",&a);
            insert(get(i,j-1,1),get(i,j,0),a);
        }
    }
    for(int i=1;i<n;i++){
        for(int j=1;j<m;j++){
            int a; scanf("%d",&a);
            insert(get(i,j,0),get(i,j,1),a);
        }
    }
}

int main(){
    scanf("%d%d",&n,&m);
    init();
    printf("%d\n",Dijkstra(0,((n-1)*(m-1)<<1)+1));
    return 0;
}

时间: 2024-12-18 21:58:33

BZOJ_1001_狼抓兔子(平面图求最小割+对偶图求最短路)的相关文章

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

Description Source: Beijing2006 [BJOI2006] 八中OJ上本题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 如今小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比較在行的.并且如今的兔子还比較笨,它们仅仅有两个窝,如今你做为狼王,面对以下这样一个网格的地形: 左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下三种类型的道路 1:(x,y)&

BZOJ1001[BeiJing2006]狼抓兔子(无向图最小割)

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 这题的题意其实就是求一个最小割,但是由于是无向图,所以加边的时候,两边的流量都要是输入的权值,然后就是一个dinic求一下最小割. 但是这题貌似有很高超的技巧来搞,可以把平面图上的最小割转成对偶图上的最短路来做,这样可以起到很明显的优化效果.现在还不是很明白,如果以后明白了,会再来更新. dinic: #include <cstdio> #include <cstring&g

bzoj 1001: [BeiJing2006]狼抓兔子 平面图最小割

平面图跑最大流 可以转换为其对偶图跑最短路 一个环对应一个割  找到最小环(即最短路)极为所求,注意辅助边的建立 加入读入优化  不过时间还是一般  估计是dij写的不好   大神勿喷~~~ /************************************************************** Problem: 1001 User: 96655 Language: C++ Result: Accepted Time:1724 ms Memory:95120 kb ****

BZOJ 1001 [BeiJing2006]狼抓兔子 平面图最大流

Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下三种类型的道路 1:(x,y)<==>(x+1,y) 2:(x,y)<==>(x,y+1) 3:(x,y)<==>(x+1,y+1) 道路上的权值表示这条路上最多能够通过的兔子数,道路是

【平面图最小割】BZOJ1001- [BeiJing2006]狼抓兔子

[题目大意]左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下三种类型的道路 1:(x,y)<==>(x+1,y) 2:(x,y)<==>(x,y+1) 3:(x,y)<==>(x+1,y+1) 道路上的权值表示这条路上最多能够通过的兔子数,道路是无向的.开始时所有的兔子都聚集在左上角(1,1)的窝里,现在它们要跑到右下解(N,M)的窝中去,如果一条道路上最多通过的兔子数为K,需要同样数量的K只狼伏击,求封锁道路的最小狼数. [思路]显然这是最小

BZOJ 1001: [BeiJing2006]狼抓兔子【最大流/SPFA+最小割,多解】

1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 23822  Solved: 6012[Submit][Status][Discuss] Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点为(1,1),右下角点为(N,M)(上图中N=4,M

BZOJ 1001: [BeiJing2006]狼抓兔子 最小割

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下三种类型的道路 1:(x,y)<==>(x+1,y) 2:(x,y)<==>(x,y+1) 3:(x,y)

BZOJ_2001_[BeiJing2006]狼抓兔子_最小割转对偶图

BZOJ_2001_[BeiJing2006]狼抓兔子 题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 分析:思路同NOI2010海拔. 注意无向图. 代码: 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 #include <queue> 5 using namespace std; 6 #define S

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

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 顺便推荐一个ppt,里面有对平面图的介绍:浅析最大最小定理在信息学竞赛中的应用. 这里直接求最小割肯定会T,所以应把原图看成一张平面图,ppt中说该平面图对应的对偶图的每一个环对应原图的一个割,这点有些不理解,不过不影响做这一道题.想象一下,在最外面那个无限大的平面,由左上角朝右下角连一条附加的边,这么做就多了一个附加面,设这条附加的边的权值为 -inf,那么最小割一定包含这一条边.