【BZOJ1001】狼抓兔子题解
BZOJ1001: [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)的窝中去,狼王开始伏击这些兔子.当然为了保险起见,如果一条道路上最多通过的兔子数为K,狼王需要安排同样数量的K只狼,才能完全封锁这条道路,你需要帮助狼王安排一个伏击方案,使得在将兔子一网打尽的前提下,参与的狼的数量要最小。因为狼还要去找喜羊羊麻烦.
Input
第一行为N,M.表示网格的大小,N,M均小于等于1000.接下来分三部分第一部分共N行,每行M-1个数,表示横向道路的权值. 第二部分共N-1行,每行M个数,表示纵向道路的权值. 第三部分共N-1行,每行M-1个数,表示斜向道路的权值. 输入文件保证不超过10M
Output
输出一个整数,表示参与伏击的狼的最小数量.
Sample Input
3 4
5 6 4
4 3 1
7 5 3
5 6 7 8
8 7 6 5
5 5 5
6 6 6
Sample Output
14
题意复述:图中边权表示控制该边需要的狼的数目,求要控制所有s到t路径所需的最少的狼的数目
看到题第一反应是最小割,从左上角到右下角做一遍最大流。看到数据范围突然发现这一定会超时啊……BZOJ的第一题就如此 >_< 还是上网看看吧。。。
对偶图
对于任意一个平面图G,都有一个与其对偶的平面图G*满足:
1. G*中的每一个点对应G中的每一个面
2. 对于G中的每一条边E,若E属于两个面f1,f2,在G*中加入边(f1,f2);若E只属于一个面f,在G*中加入自环(f,f)
如图:右侧的粉色点和边即为转化后的对偶图
对偶图的性质:
1. G*的点数等于G的面数,G*的边数等于G的边数
2. G*中的环对应G中的割
∴可应用此性质求最小割!!!
应用对偶图求最小割
步骤:
1. 在平面图中的起点和终点之间加一条边
2. 将平面图(即原来的图)转化为对偶图,记起点和终点构成的边组成的面为源点,无界面为汇点,每条边的权等于原图中对应边的权
3. 删去源点和汇点之间的边
4. 在对偶图上求最短路即为原图的最大流(或最小割)
本题中对偶图构造如图:
按照新图应用dijkstra+堆优化即可AC~
时间效率O(nlogn)
代码:>_<
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=1000*1000;
struct edge
{int xx,ww,nn;
}e[6*maxn+100];
struct qnode
{int xx,nn;
}tmp;
priority_queue<qnode> q;
int p[2*maxn+100],dist[2*maxn+100];
int n,m,w,tail,x,y;
bool visit[2*maxn+100];
bool operator <(const qnode &x,const qnode &y)
{if (x.xx>y.xx) return true; else return false;
}
void addedge(int x,int y,int w)
{tail++; e[tail].xx=y; e[tail].ww=w; e[tail].nn=p[x]; p[x]=tail;
}
void dij(int x)
{memset(dist,0x7f,sizeof(dist));memset(visit,false,sizeof(visit));dist[x]=0;qnode tmp;tmp.xx=0; tmp.nn=x;q.push(tmp);while (!q.empty()){tmp=q.top();q.pop();int key=tmp.nn;visit[key]=true;int dd=tmp.xx;int t=p[key];while (t!=-1){if (!visit[e[t].xx] && dist[e[t].xx]>dd+e[t].ww){dist[e[t].xx]=dd+e[t].ww;tmp.xx=dist[e[t].xx];tmp.nn=e[t].xx;q.push(tmp);}t=e[t].nn;}}
}
int main()
{/*freopen("1001.in","r",stdin);freopen("1001.out","w",stdout);*/scanf("%d%d",&n,&m);if (n==1 || m==1){int ans=2100000000;for (int i=1;i<max(m,n);i++){scanf("%d",&w);ans=min(ans,w);}printf("%d\n",ans);return 0;}memset(p,255,sizeof(p));for (int i=1;i<=n;i++)for (int j=1;j<m;j++){scanf("%d",&w);if (i==1){x=1; y=j*2+1;addedge(x,y,w);addedge(y,x,w);}else if (i==n){x=(n-1)*(m-1)*2+2; y=((i-2)*(m-1)+j)*2;addedge(x,y,w);addedge(y,x,w);}else{x=((i-2)*(m-1)+j)*2; y=((i-1)*(m-1)+j)*2+1;addedge(x,y,w);addedge(y,x,w);}}for (int i=1;i<n;i++)for (int j=1;j<=m;j++){scanf("%d",&w);if (j==1){x=(n-1)*(m-1)*2+2; y=((i-1)*(m-1)+j)*2;addedge(x,y,w); addedge(y,x,w);}else if (j==m){x=1; y=((i-1)*(m-1)+j-1)*2+1;addedge(x,y,w); addedge(y,x,w);}else{x=((i-1)*(m-1)+j-1)*2+1; y=((i-1)*(m-1)+j)*2;addedge(x,y,w); addedge(y,x,w);}}for (int i=1;i<n;i++)for (int j=1;j<m;j++){scanf("%d",&w);x=((i-1)*(m-1)+j)*2; y=((i-1)*(m-1)+j)*2+1;addedge(x,y,w); addedge(y,x,w);}n=(n-1)*(m-1)*2+2;dij(1);printf("%d\n",dist[n]);return 0;
}
【BZOJ1001】狼抓兔子题解相关推荐
- BZOJ1001 狼抓兔子 终于过了!
时间来不及了,先贴代码吧!有时间再写. 好苦逼啊,WA了若干次,还有一次RE,一次TLE. 虽然主要运用的算法和资料都由师兄提供了.还是太弱了,太天真了. 首先,数据范围就WA了,RE了,TLE了. ...
- [bzoj1001]狼抓兔子
现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点 ...
- bzoj1001狼抓兔子
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...
- 【BJOI2006】bzoj1001 狼抓兔子
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...
- BZOJ1001 狼抓兔子
最小割 代码 # include <bits/stdc++.h> # define IL inline # define RG register # define Fill(a, b) m ...
- 【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 ...
- bzoj 1001狼抓兔子
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 15622 Solved: 3771 [ Sub ...
最新文章
- 标题 相机标定(Camera calibration)原理和步骤
- Go复盘--再识Go语言
- POJ 2229 Sumsets
- css各兼容应该注意的问题
- SpringCloud工作笔记033---找不到import org.springframework.cloud.client.discovery.EnableDiscoveryClient;无法导入
- 计算机网络学习socket--day3
- This is Huge! PhysBAM code is going to be released?
- 跟我一起学Angular2(1)-了解ng模块化
- python能运行vb_vb编程 vb还是python强大
- Foobar2000目前最强解码方案
- 计算机的屏幕录像,如何进行电脑屏幕录像?电脑录制屏幕视频的方法|电脑屏幕录像的图文步骤...
- 显示最新的Picasaweb上传
- 银行业金融机构数据治理指引和DCMM的对比分析
- Excel —— 录制宏
- 兄弟连Linux(二)--Linux常用命令
- php入门,windows安装与环境配置,基础语法学习
- 透彻理解高斯过程Gaussian Process (GP)
- 芯片组成、制作、涉及到的产业链
- 国外数藏动态:7月6日至10日即将发售的藏品
- 四平方数和定理(leetcode 279 python)
热门文章
- 如何写一首让人膜拜的代码情诗?
- windows-start-iexplorer
- python能制作游戏吗_什么用Python让制作的游戏角色移动起来?
- win10访问局域网出现“请检查名称的拼写”如何解决
- 一篇文章读懂“天猫无货源店群”,这是一个怎么样的项目?
- android 人脸识别demo
- 笔记本电脑电源指示灯亮但是黑屏开不了机(或者成功开机之后发现很卡顿)的解决方法
- css文件怎么打开iphone,如何使用HTML / CSS在iPhone上显示代码
- python生成每个月最后一天_python 求下个月的最后一天
- 黑客攻防技术宝典(四)