ICPC-Beijing 2006 狼抓兔子

题目描述

题解:

裸的最小割。

但是最大流跑不过去怎么办?

转变一下,既然最大流是一条左下<->右上的通路,我们可以把图划分为若干区域,

最后找左下到右上的最短路就行了。

代码:

#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 1100;
template<typename T>
inline void read(T&x)
{
    T f = 1,c = 0;char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){c=c*10+ch-‘0‘;ch=getchar();}
    x = f*c;
}
int n,m,s,t,hed[2*N*N],cnt;
int _id(int i, int j, int k) {
    if(i>n||j<1)return 0;
    if(i<1||j>m)return n*m<<1|1;
    return (i - 1) * m + j + k * n * m;
}
struct EG
{
    int to,nxt;
    ll w;
}e[6*N*N];
void ae(int f,int t,ll w)
{
    e[++cnt].to = t;
    e[cnt].nxt = hed[f];
    e[cnt].w = w;
    hed[f] = cnt;
}
struct Pair
{
    int x;
    ll d;
    Pair(){}
    Pair(int x,ll d):x(x),d(d){}
    friend bool operator < (Pair a,Pair b){return a.d>b.d;}
}tp;
ll dis[2*N*N];
bool vis[2*N*N];
void dij()
{
    priority_queue<Pair>q;
    memset(dis,0x3f,sizeof(dis));dis[s]=0;
    q.push(Pair(s,0));
    while(!q.empty())
    {
        tp = q.top();
        q.pop();
        int u = tp.x;
        if(vis[u])continue;
        vis[u]=1;
        for(int j=hed[u];j;j=e[j].nxt)
        {
            int to = e[j].to;
            if(dis[to]>dis[u]+e[j].w)
            {
                dis[to] = dis[u]+e[j].w;
                q.push(Pair(to,dis[to]));
            }
        }
    }
}
int main()
{
    read(n),read(m);
    n--,m--;
    s = 0,t = n*m<<1|1;
    for(int i=1;i<=n+1;i++)
        for(int w,j=1;j<=m;j++)
        {
            read(w);
            ae(_id(i,j,1),_id(i-1,j,0),w);
            ae(_id(i-1,j,0),_id(i,j,1),w);
        }
    for(int i=1;i<=n;i++)
        for(int w,j=1;j<=m+1;j++)
        {
            read(w);
            ae(_id(i,j,0),_id(i,j-1,1),w);
            ae(_id(i,j-1,1),_id(i,j,0),w);
        }
    for(int i=1;i<=n;i++)
        for(int w,j=1;j<=m;j++)
        {
            read(w);
            ae(_id(i,j,0),_id(i,j,1),w);
            ae(_id(i,j,1),_id(i,j,0),w);
        }
    dij();
    printf("%lld\n",dis[t]);
    return 0;
}

原文地址:https://www.cnblogs.com/LiGuanlin1124/p/10351704.html

时间: 2024-11-05 22:57:20

ICPC-Beijing 2006 狼抓兔子的相关文章

BZOJ 1001 Beijing 2006 狼抓兔子 最小割

题目大意:有一张无向图,描述的是兔子窝的位置和之间的边.现在狼来抓兔子了,兔子慌忙的从(1,1)逃走到(m,n).每条边上都有能通过最多的兔子数量.狼不想让兔子逃走,每在一条边驻守一只狼就可以避免一个兔子通过.问最少多少狼可以让所有兔子都不能逃走. 思路:建图,按题目中的意思是去掉最小的边使得源到汇不连通,显然的最小割. CODE: #include <queue> #include <cstdio> #include <cstring> #include <io

BZOJ 1001 [BJOI 2006] 狼抓兔子

BZOJ题面 瑾以此题纪念博主迈出冲刺省选的第一步 打眼一看,这不是裸的最小割吗? 最小割 == 最大流: 然后 5 分钟码完 ISAP : 交上去一看......TLE......懵逼...... 然后进行了一波没有卵用的优化常数...... (去他妈的 1e6 个点,3e6 条边!!!) 问了问度娘,才知道这题的图是 '平面图' : 平面图的最小割和最大流可以通过将其转换成对偶图跑最短路求解:(涨姿势) 那么什么是对偶图呢? 通俗的讲,对偶图就是把原图的点换成面(边围成的区域),面换成点,而

解题:BJOI 2006 狼抓兔子

题面 可以看出来是最小割,然后你就去求最大流了 这么大的范围就是让你用网络流卡的?咋想的啊=.=??? 建议还是老老实实用 平面图最小割等于其对偶图最短路 这个东西来做吧,虽然这个东西跑的也挺慢的,最后一个点跑了$2s$ 对偶图就是被边分割出来的每个区域当成一个点,然后两个区域有公共边就连边,起点和终点的问题就在源汇点中间连一条边然后就能分出来了 1 #include<queue> 2 #include<cstdio> 3 #include<cctype> 4 #inc

bzoj1001 [ICPC-Beijing 2006]狼抓兔子

我满心以为本题正解为最短路,结果到处都是最大流-- 几乎所有的都写了什么"对偶图"跑最短路~~,但我真的不知道什么叫做对偶图~~-------------------------------------------------------------------------------------------------介绍一下本题的最短路算法叭.并不算难.主要是感性理解. 首先很容易观察出这是一个最小割,那么就是求最大流了. 但是这题的点数高达10e6,按常理来说最大流应该稳稳地TL

Luogu P4001 [ICPC-Beijing 2006]狼抓兔子

Link 平面图的最小割等于其对偶图的最短路. 虽然我不会证但感觉确实挺好理解的. #include<queue> #include<cstdio> #include<cctype> #include<vector> #include<cstring> #include<utility> #include<functional> #define pi pair<int,int> #define fi first

bzoj1001 [BeiJing2006]狼抓兔子

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

P2030 - 【BJOI2006】狼抓兔子

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

【BZOJ】1001: [BeiJing2006]狼抓兔子

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) 道路上的权值表示这条路上最多能够通过的兔子数,道路是无向的. 左上角和右下角为兔子的两个窝,开始时所有的兔子都聚集在左上角(1,1)的窝里,现在它们要跑到右下角(N,M)的窝中去,狼王开始伏击

BJOI2006狼抓兔子

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