[BJ2006] 狼抓兔子
题目链接:戳我
按理说以dinic\(O(M*N^2)\)的时间复杂度应该是过不去的(呃我也知道这个上界很松)。但是最小割确实可以水过去??
但是本着写正解的精神,我还是学了学平面图和对偶图,跑最短路的话时间复杂度应该是正确的。(大家可以去上网搜一下,或者看蒟蒻的OI网络流 简单学习笔记)
所以就。。。建图呗。这种题最难的不就是建图嘛。
建议大家画一个图(图的范例比如说ljh dalao的这张qwq)
具体细节可以看代码。
注意n=1或者m=1的情况要特判。
然后因为点的上限(n-1)(m-1)*2+1,所以空间一定注意要开够qwqwq
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define S 0
#define T (n-1)*(m-1)*2+1
#define MAXN 4000010
using namespace std;
int n,m,t,cur;
int dis[MAXN],done[MAXN],head[MAXN];
struct Node
{
    int u,d;
    friend bool operator <(struct Node x,struct Node y)
        {return x.d>y.d;}
};
struct Edge{int nxt,to,dis;}edge[MAXN<<1];
inline void add(int from,int to,int dis)
{
    edge[++t].nxt=head[from],edge[t].to=to,edge[t].dis=dis,head[from]=t;
    edge[++t].nxt=head[to],edge[t].to=from,edge[t].dis=dis,head[to]=t;
}
inline void dij()
{
    priority_queue<Node>q;
    memset(dis,0x3f,sizeof(dis));
    memset(done,0,sizeof(done));
    q.push((Node){S,0});dis[S]=0;
    while(!q.empty())
    {
        int u=q.top().u; q.pop();
        if(done[u]) continue;
        done[u]=1;
        for(int i=head[u];i;i=edge[i].nxt)
        {
            int v=edge[i].to;
            if(dis[u]+edge[i].dis<dis[v])
                dis[v]=dis[u]+edge[i].dis,q.push((Node){v,dis[v]});
        }
    }
}
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("ce.in","r",stdin);
    #endif
    scanf("%d%d",&n,&m);
    if(n==1)
    {
        int minn=2147483647,cur;
        for(int i=1;i<m;i++)
            scanf("%d",&cur),minn=min(minn,cur);
        printf("%d\n",minn);
        return 0;
    }
    if(m==1)
    {
        int minn=2147483647,cur;
        for(int i=1;i<n;i++)
            scanf("%d",&cur),minn=min(minn,cur);
        printf("%d\n",minn);
        return 0;
    }
    for(int i=1;i<=2*(n-1)+1;i+=2)
        for(int j=1;j<m;j++)
        {
            scanf("%d",&cur);
            if(i==1) add(S,j,cur);
            else if(i==2*(n-1)+1) add((i-2)*(m-1)+j,T,cur);
            else add((i-2)*(m-1)+j,(i-1)*(m-1)+j,cur);
        }
    for(int i=1;i<2*(n-1)+1;i+=2)
        for(int j=1;j<=m;j++)
        {
            scanf("%d",&cur);
            if(j==1) add(i*(m-1)+1,T,cur);
            else if(j==m) add(S,(i-1)*(m-1)+m-1,cur);
            else add((i-1)*(m-1)+j-1,i*(m-1)+j,cur);
        }
    for(int i=1;i<2*(n-1)+1;i+=2)
        for(int j=1;j<m;j++)
        {
            scanf("%d",&cur);
            add((i-1)*(m-1)+j,i*(m-1)+j,cur);
        }
    dij();
    printf("%d\n",dis[T]);
    return 0;
}
[BJ2006] 狼抓兔子的更多相关文章
- BZOJ 1001: [BeiJing2006]狼抓兔子
		1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 20029 Solved: 4957[Submit][ ... 
- BZOJ1001: [BeiJing2006]狼抓兔子 [最小割 | 对偶图+spfa]
		1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 19528 Solved: 4818[Submit][ ... 
- 【BZOJ1001】狼抓兔子
		1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 7530 Solved: 1724[Submit][S ... 
- BZOJ 1001 [BeiJing2006] 狼抓兔子(平面图最大流)
		题目大意 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的.而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: ... 
- BZOJ-1001  狼抓兔子  (最小割-最大流)平面图转对偶图+SPFA
		1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 14686 Solved: 3513 [Submit][ ... 
- 【BZOJ】【1001】 【BJOI2006】狼抓兔子
		平面图最小割->对偶图最短路 平面图最小割转对偶图最短路= = 想到了就比较好写了…… 可能是我对区域的标号方式比较奇特?反正我没有特判n==1||m==1也能过2333(机智吧-(滚开啦你个自 ... 
- 【BZOJ】1001: [BeiJing2006]狼抓兔子 Dinic算法求解平面图对偶图-最小割
		1001: [BeiJing2006]狼抓兔子 Description 左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下 三种类型的道路 1:(x,y)<==>( ... 
- BZOJ_1001_狼抓兔子_(平面图求最小割+对偶图求最短路)
		描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1001 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec ... 
- BJOI2006狼抓兔子
		1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 9967 Solved: 2267[Submit][S ... 
随机推荐
- mongodb 的操作
			查找 db.collection的名字.find({"group":"kkkk","key":{$regex:/.*one.*/i}}); ... 
- python:while 语句的使用方法
			while语句: count = 0 while True: print(count) count += 1 if count == 10: break 实例: 计算n!,若:n = 5:则:n! = ... 
- jBPM4.4 eclipse插件安装
			一.工具下载 jBPM 图形化流程设计器采用eclipse做为平台,我们可以先到jBPM官方网站下jBPM4.4,地址:http://sourceforge.net/projects/jbpm ... 
- android学习-Eclipse中修改Android项目图标
			参考原文:http://blog.csdn.net/wpwbb510582246/article/details/52556753 方法一:替换res文件夹下的ic_launcher-web.png图 ... 
- Linux实战教学笔记28:企业级LNMP环境应用实践
			一,LNMP应用环境 1.1 LNMP介绍 大约在2010年以前,互联网公司最常用的经典Web服务环境组合就是LAMP(即Linux,Apache,MySQL,PHP),近几年随着Nginx Web服 ... 
- SpringBoot整合ActiveMQ快速入门
			Spring Boot 具有如下特性: 为基于 Spring 的开发提供更快的入门体验 开箱即用,没有代码生成,也无需 XML 配置.同时也可以修改默认值来满足特定的需求. 提供了一些大型项目中常见的 ... 
- BarcodeLib -- 一个精简而不失优雅的条形码生成库
			BarcodeLib -- 一个精简而不失优雅的条形码生成库 引言 在百度进行“C# 条形码”等类似关键字搜索的时候,基本上是使用 ZXing 类库进行条形码的生成.今天我所介绍的是另一款类库 Bar ... 
- Spring Data JPA + layui的前台分页插件layPage实现页面的分页
			一.后台代码: 1.1 controller层代码 @RequestMapping("/xxxxxx") public String showInformationCode(Str ... 
- not1,not2,bind1st和bind2nd详解
			1.引言 bind1st和bind2nd函数用于将一个二元函数对象(binary functor,bf)转换成一元函数对象(unary functor,uf).为了达到这个目的,它们需要两个参数:要转 ... 
- Use formatter to format your JAVA code
			In order to make the codes looks unified and make it easy to understand, it's better to use the same ... 
