BZOJ 1001[BeiJing2006]狼抓兔子 最小割转最短路
Description
Input
Output
输出一个整数,表示参与伏击的狼的最小数量.
Sample Input
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
HINT
2015.4.16新加数据一组,可能会卡掉从前可以过的程序。
这题第一眼看到觉得是最大流问题。。但是数据很大,不太对?(其实是我不熟悉网络流)
然后的话,这题实际上可以看作一个最短路问题。
推荐论文:两极相通——浅谈最大—最小定理在信息学竞赛中的应 周冬
大概说一下这个例子是如何建图的。
然后我们看到这张图里面分了很多三角块,从左上角的左下三角开始,
标号1,然后第一个矩阵的右上标为2.......大概这样:
然后原点可以看作13,重点看作14.
两个点之间的路径,其实就是通过的边的边权。
比如说8~9,长度是7,5~6是5等等。
至于13和14图片中没有标明,13在左下角,14在右上角。
这两个是原点和终点,我们的目标就是从原点走到终点。
原点和网格图的最左/最下的块相连。比如13连着1,7,9,11。
同理14连着2,4,6,12.
还有一些就是相邻的一些点(如8和7,9,1)他们之间也需要连一条边。
建图的过程有点小麻烦。。不过思考一下就能想通了。
(add的过程是边表加边,由于无向边,所以加两次。heng[][]这种是题目读入的数据)
void build(){N=(n-1)*(m-1)<<1;Ecnt=0;for (int i=1;i<=N;i++){int a=i/((m-1)<<1),b=i%((m-1)<<1);if (i&1){add(i,i+1,xie[a+1][(b>>1)+1]);add(i+1,i,xie[a+1][(b>>1)+1]);if (i+((m-1)<<1)+1<=N)add(i,i+((m-1)<<1)+1,heng[a+2][(b>>1)+1]),add(i+((m-1)<<1)+1,i,heng[a+2][(b>>1)+1]);}elseif (b) add(i,i+1,shu[a+1][(b>>1)+1]),add(i+1,i,shu[a+1][(b>>1)+1]);}int tmp; //上面是分出的块内部的关系,下面处理最周边一圈和原点以及终点的关系start=N+1; end=N+2;for (int i=1;i<=N;i+=(m-1)<<1){int a=i/((m-1)<<1);add(start,i,shu[a+1][1]);add(i,start,shu[a+1][1]);tmp=i;}for (int i=tmp;i<=N;i+=2){int a=i%((m-1)<<1);add(start,i,heng[n][(a>>1)+1]);add(i,start,heng[n][(a>>1)+1]);tmp=i;}tmp++;for (int i=tmp;i;i-=(m-1)<<1){int a=i/((m-1)<<1);add(end,i,shu[a][m]);add(i,end,shu[a][m]);tmp=i;}for (int i=tmp;i;i-=2){add(end,i,heng[1][i>>1]);add(i,end,heng[1][i>>1]);}
}
然后建图完毕后就可以直接跑最短路了。
由于有(n-1)*(m-1)*2+2个节点,2000000,所以可用SPFA或者dij+优先队列。
这个最短路的部分就不说了。。直接跑。。
注意了,此题有个坑。。我掉进去好久。
当n=1 || m=1,我的程序会出点错(由于我建图的打法)
所以这个时候特判就好了。
#include<bits/stdc++.h>
using namespace std;
int n,m,N,Ecnt,dis[6000005];
bool vis[6000005];
int start,end;
struct Edge{int next,to,val;
}ty[6000005]; int head[6000005];
struct Heap{int num,val;
};
#define qq(a,b) (Heap){a,b}
priority_queue<Heap,vector<Heap> >Q;
void add(int u,int v,int w){ty[++Ecnt].next=head[u];ty[Ecnt].to=v;ty[Ecnt].val=w;head[u]=Ecnt;
}
int heng[1005][1005],shu[1005][1005],xie[1005][1005];
void tyread(){scanf("%d%d",&n,&m);for (int i=1;i<=n;i++)for (int j=1;j<m;j++) scanf("%d",&heng[i][j]);for (int i=1;i<n;i++)for (int j=1;j<=m;j++) scanf("%d",&shu[i][j]);for (int i=1;i<n;i++)for (int j=1;j<m;j++) scanf("%d",&xie[i][j]);
}
void build(){N=(n-1)*(m-1)<<1;Ecnt=0;for (int i=1;i<=N;i++){int a=i/((m-1)<<1),b=i%((m-1)<<1);if (i&1){add(i,i+1,xie[a+1][(b>>1)+1]);add(i+1,i,xie[a+1][(b>>1)+1]);if (i+((m-1)<<1)+1<=N)add(i,i+((m-1)<<1)+1,heng[a+2][(b>>1)+1]),add(i+((m-1)<<1)+1,i,heng[a+2][(b>>1)+1]);}elseif (b) add(i,i+1,shu[a+1][(b>>1)+1]),add(i+1,i,shu[a+1][(b>>1)+1]);}int tmp;start=N+1; end=N+2;for (int i=1;i<=N;i+=(m-1)<<1){int a=i/((m-1)<<1);add(start,i,shu[a+1][1]);add(i,start,shu[a+1][1]);tmp=i;}for (int i=tmp;i<=N;i+=2){int a=i%((m-1)<<1);add(start,i,heng[n][(a>>1)+1]);add(i,start,heng[n][(a>>1)+1]);tmp=i;}tmp++;for (int i=tmp;i;i-=(m-1)<<1){int a=i/((m-1)<<1);add(end,i,shu[a][m]);add(i,end,shu[a][m]);tmp=i;}for (int i=tmp;i;i-=2){add(end,i,heng[1][i>>1]);add(i,end,heng[1][i>>1]);}
}
bool operator<(Heap x,Heap y){return x.val>y.val;
}
void dijkstra(int s,int t){memset(vis,0,sizeof(vis));memset(dis,60,sizeof(dis));dis[s]=0;Q.push(qq(s,0));while ((!Q.empty())){Heap mi=Q.top();Q.pop();if (vis[mi.num]) continue;vis[mi.num]=1;for (int j=head[mi.num];j;j=ty[j].next){int q=ty[j].to;if (vis[q]) continue;int w=ty[j].val;if (w+mi.val<dis[q]){dis[q]=w+mi.val;Q.push(qq(q,dis[q]));}}}
}
int main(){tyread();if (n==1 || m==1){int ans=1e9;if (n==1){for (int j=1;j<m;j++)ans=min(ans,heng[1][j]);printf("%d\n",ans);} else{for (int i=1;i<n;i++)ans=min(ans,shu[i][1]);printf("%d\n",ans);}return 0;}build();dijkstra(start,end);printf("%d\n",dis[end]);return 0;
}
BZOJ 1001[BeiJing2006]狼抓兔子 最小割转最短路相关推荐
- BZOJ 1001: [BeiJing2006]狼抓兔子【最大流/SPFA+最小割,多解】
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 23822 Solved: 6012 [Submit ...
- BZOJ1001[BeiJing2006]狼抓兔子——最小割
题目描述 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: ...
- BZOJ1001[BeiJing2006]狼抓兔子最小割網絡流
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...
- bzoj 1001: [BeiJing2006]狼抓兔子
Time Limit: 15 Sec Memory Limit: 162 MB Submit: 21007 Solved: 5251 [Submit][Status][Discuss] Descr ...
- 1001: [BeiJing2006]狼抓兔子(对偶图)
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 23595 Solved: 5940 Descrip ...
- 1001: [BeiJing2006]狼抓兔子
/**************************************************************Problem: 1001User: whymheLanguage: C+ ...
- 【BZOJ - 1001】狼抓兔子(无向图网络流,最小割,或平面图转对偶图求最短路SPFA)
题干: 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: ...
- 对偶图 【BZOJ】1001: [BeiJing2006]狼抓兔子(对偶图+最短路)
http://www.lydsy.com/JudgeOnline/problem.php?id=1001 可谓惨不忍睹,一下午就在调这题了. 很久以前看到这题是一眼最大流,看到n<=1000,我 ...
- 【bzoj 1001】狼抓兔子
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个 ...
最新文章
- 她,诗人拜伦之女,英国数学家,历史上第一位程序员
- 同济大学计算机云南2019,同济大学录取分数线2019(在各省市录取数据)
- Android中使用ViewStub提高布局性能
- boost::hana::when_valid用法的测试程序
- 通配符(WildCard)与正则表达式(Regular Expression)
- 【C语言】俄罗斯方块的源代码
- 内存映射文件原理(转载)
- 菜鸟教程 Java 学习笔记 (基础教程)
- 小马哥讲Spring核心编程思想 - 第二章 重新认识IoC
- 青岛新媒体运营教程:教你玩转抖音企业号,6步玩转抖音蓝v号
- iphone之Info.plist的属性
- 电阻-横向评测(转载)
- 大数据创造大价值 我国大数据发展具有独特优势
- android studio计时器怎么用,android - Android Studio:启动倒数计时器时应用崩溃
- NLP面试宝典:38个最常见NLP问题答案一文get
- python之路——进程
- 0603-0605读书报告
- 关于QQ一些功能的实现(二)
- 如何测试代理IP的质量?
- Cannot load driver class: com.mysql.cj.jdbc.Driver
热门文章
- ipad html 不自动播放,ipad上不了网
- 被国人误解了千年的七句话之天地不仁,以万物为刍狗
- pycharm是干什么的
- python学习之类class继承、super()使用和__init__初始化
- android接入高德API,生成正式包后,导航页面闪退
- 破局数字化转型,华为云大数据BI解决方案表现抢眼
- 还在问腾讯云怎么样?这一篇云直播解析速速收好!
- Win10怎么关闭自带杀毒软件?2招彻底关闭Windows Defender方法
- Vue基础篇六:Vue使用JSX进行动态渲染
- 华为服务器系统备份,华为云服务器备份的2种形式有啥区别?