[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_JUDGEfreopen("ce.in","r",stdin);#endifscanf("%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;
}
转载于:https://www.cnblogs.com/fengxunling/p/10298014.html
[BJ2006] 狼抓兔子相关推荐
- 狼抓兔子(平面图转对偶图)
狼抓兔子(平面图转对偶图) 面对下面这样一个网格的地形: 道路上的权值表示这条路上最多能够通过的兔子数,道路是无向的. 左上角和右下角为兔子的两个窝,开始时所有的兔子都聚集在左上角(1,1)的窝里,现 ...
- BZOJ 1001: [BeiJing2006]狼抓兔子【最大流/SPFA+最小割,多解】
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 23822 Solved: 6012 [Submit ...
- 1001: [BeiJing2006]狼抓兔子
/**************************************************************Problem: 1001User: whymheLanguage: C+ ...
- BZOJ1001 狼抓兔子 终于过了!
时间来不及了,先贴代码吧!有时间再写. 好苦逼啊,WA了若干次,还有一次RE,一次TLE. 虽然主要运用的算法和资料都由师兄提供了.还是太弱了,太天真了. 首先,数据范围就WA了,RE了,TLE了. ...
- 1001: [BeiJing2006]狼抓兔子(对偶图)
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 23595 Solved: 5940 Descrip ...
- P2030 - 【BJOI2006】狼抓兔子
P2030 - [BJOI2006]狼抓兔子 Description 八中OJ上本题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现 ...
- 【BZOJ1001】狼抓兔子
[BZOJ1001]狼抓兔子 题面 bzoj 题解 懒得平面图转对偶图了,直接最小割板子加优化. #include <iostream> #include <cstdio> # ...
- 【bzoj1001】【狼抓兔子】
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 12719 Solved: 3017 [Submit][ ...
- bzoj1001/BJOI2006 狼抓兔子
1001: [BeiJing2006]狼抓兔子(传送门) 图论新知识..没学过.. 平面图最小割等于对偶图的最短路 详见课件:http://wenku.baidu.com/view/8f1fde586 ...
- 【BZOJ1001】狼抓兔子题解
BZOJ1001: [BeiJing2006]狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还 ...
最新文章
- 图神经网络可以解决现实世界中的问题吗?
- CentOS 5.X 开机启动流程
- 凭借这 10 大算法,就可以主宰世界!
- BAT Window批量重命名
- 在URL参数中传递复杂对象
- java 4个系统,JSP系统的四个组成部分
- android radiogroup 获取点击位置_屏幕连点器,解放双手[Android]
- JavaScript doT模板引擎
- html链接sqlserver,js连接sqlserver进行查询
- cocos2dx 3.0 触摸机制
- camunda 流程执行追踪_从Activiti分裂而来的camunda BPM
- 迈信EP100伺服驱动器方案
- 适合英语学习的100部电影
- Android进阶知识(五):IPC基本概念之Binder、Binder工作机制及其原理
- 相信我,我们离成为废物阶级不远了!
- Rest-assured使用
- 51单片机定时器中断
- 在线测试手机性能软件,性能:三大跑分
- 探索鼎龙湾德萨斯牛仔小镇,欣赏粤西非遗文化的魅力
- 预告:年度乘用车前装超声波雷达市场,哪些供应商表现抢眼