[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 ...
随机推荐
- Zabbix Agent 自动、主动注册
简述: 今天来研究一下 Zabbix 的主动注册功能. 当你有十台机器需要监控时,你手动去添加是没有问题的.但是当你有五十台.上百台或更多服务器要监控时,你会怎么做 ? Active Agent Au ...
- Hash表从了解到深入(浅谈)
· Hasn表,将一个数据进行Value化,再进行一个映射关系到Key直接进行访问的一个数据结构,这样可以通过直接的计算进行数据的访问和插入.关于Hash表的基本概念这里就不一一叙述,可以通过百度了解 ...
- Centos7.2下编译安装python3.7
1.安装python3.7所需要的依赖. yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel rea ...
- 使用opencv-python画OpenCV LOGO
OpenCV2-Python 官方教程的练习 代码: #-*- coding:utf-8 -*- import numpy as np import cv2 img = np.zeros((512, ...
- mysql默认字符编码设置教程:my.ini设置字符编码
在mysql的安装目录下找到my.ini,如果没有就把my-medium.ini复制为一个my.ini即可. 打开my.ini以后, [client] default-character-set=ut ...
- UITextView设置占位文字
这里只介绍一种,这种方便扩展,可以占位文字颜色. 我们继承一个UITextView: #import <UIKit/UIKit.h> @interface MyTextView : UIT ...
- 750. Number Of Corner Rectangles四周是点的矩形个数
[抄题]: Given a grid where each entry is only 0 or 1, find the number of corner rectangles. A corner r ...
- etherboot无盘启动
2001.10.30 吴峰光 本站提供对无盘启动的支持.本文就此作一简单介绍. 一.概述 无盘启动,更确切的说是网络启动,可算是最为轻松和简便的启动方式了. 目前还很少有人了解它,因为目前的软硬件条件 ...
- noi2729 Blah数集
Blah数集 大数学家高斯小时候偶然间发现一种有趣的自然数集合Blah,对于以a为基的集合Ba定义如下: (1) a是集合Ba的基,且a是Ba的第一个元素: (2)如果x在集合Ba中,则2x+1和3x ...
- code3027 线段覆盖2
dp 数据:d[i].a d[i].b d[i].v 分别表示第i条线段的起始点,结束点,价值 先按d[i].b排好序 dp[i]表示前i条线段的最大价值 方程: dp[i]=max{ dp[i-1] ...