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】狼抓兔子题解相关推荐

  1. BZOJ1001 狼抓兔子 终于过了!

    时间来不及了,先贴代码吧!有时间再写. 好苦逼啊,WA了若干次,还有一次RE,一次TLE. 虽然主要运用的算法和资料都由师兄提供了.还是太弱了,太天真了. 首先,数据范围就WA了,RE了,TLE了. ...

  2. [bzoj1001]狼抓兔子

    现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点 ...

  3. bzoj1001狼抓兔子

    Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...

  4. 【BJOI2006】bzoj1001 狼抓兔子

    Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...

  5. BZOJ1001 狼抓兔子

    最小割 代码 # include <bits/stdc++.h> # define IL inline # define RG register # define Fill(a, b) m ...

  6. 【BZOJ1001】狼抓兔子

    [BZOJ1001]狼抓兔子 题面 bzoj 题解 懒得平面图转对偶图了,直接最小割板子加优化. #include <iostream> #include <cstdio> # ...

  7. 【bzoj1001】【狼抓兔子】

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 12719 Solved: 3017 [Submit][ ...

  8. bzoj1001/BJOI2006 狼抓兔子

    1001: [BeiJing2006]狼抓兔子(传送门) 图论新知识..没学过.. 平面图最小割等于对偶图的最短路 详见课件:http://wenku.baidu.com/view/8f1fde586 ...

  9. bzoj 1001狼抓兔子

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec   Memory Limit: 162 MB Submit: 15622   Solved: 3771 [ Sub ...

最新文章

  1. 标题 相机标定(Camera calibration)原理和步骤
  2. Go复盘--再识Go语言
  3. POJ 2229 Sumsets
  4. css各兼容应该注意的问题
  5. SpringCloud工作笔记033---找不到import org.springframework.cloud.client.discovery.EnableDiscoveryClient;无法导入
  6. 计算机网络学习socket--day3
  7. This is Huge! PhysBAM code is going to be released?
  8. 跟我一起学Angular2(1)-了解ng模块化
  9. python能运行vb_vb编程 vb还是python强大
  10. Foobar2000目前最强解码方案
  11. 计算机的屏幕录像,如何进行电脑屏幕录像?电脑录制屏幕视频的方法|电脑屏幕录像的图文步骤...
  12. 显示最新的Picasaweb上传
  13. 银行业金融机构数据治理指引和DCMM的对比分析
  14. Excel —— 录制宏
  15. 兄弟连Linux(二)--Linux常用命令
  16. php入门,windows安装与环境配置,基础语法学习
  17. 透彻理解高斯过程Gaussian Process (GP)
  18. 芯片组成、制作、涉及到的产业链
  19. 国外数藏动态:7月6日至10日即将发售的藏品
  20. 四平方数和定理(leetcode 279 python)

热门文章

  1. 如何写一首让人膜拜的代码情诗?
  2. windows-start-iexplorer
  3. python能制作游戏吗_什么用Python让制作的游戏角色移动起来?
  4. win10访问局域网出现“请检查名称的拼写”如何解决
  5. 一篇文章读懂“天猫无货源店群”,这是一个怎么样的项目?
  6. android 人脸识别demo
  7. 笔记本电脑电源指示灯亮但是黑屏开不了机(或者成功开机之后发现很卡顿)的解决方法
  8. css文件怎么打开iphone,如何使用HTML / CSS在iPhone上显示代码
  9. python生成每个月最后一天_python 求下个月的最后一天
  10. 黑客攻防技术宝典(四)