浅析最大最小定理在信息学竞赛中的应用---周东

↑方法介绍
对于一个联通的平面图G(满足欧拉公式) 在s和t间新连一条边e;
然后建立一个原图的对偶图G*,G*中每一个点对应原图中每一个面,每一条边对应分割面的每一条边;
那么对偶图G*中,以原图s和t间边e新划分出的面作为起点(s*),最外的面作为终点(t*);
那么从s*到t*的每一条路都是原图G的一个割;
下图来自上方标出百度文库网址的ppt;
然后用堆(优先队列)优化的迪杰斯特拉,复杂度 O((m+n)logn) n为点数,m为边数...
 
嗯存一个堆优化迪杰斯特拉的代码...很久以前那个没有标签的一通好找..
  1. #include<cmath>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. #include<queue>
  7. using namespace std;
  8. #define pa pair<int,int>
  9. int n,m,s,t;
  10. struct node{
  11. int y;
  12. int next;
  13. int v;
  14. }e[];
  15. int head[]={},tot=,dis[]={};
  16. bool vis[]={};
  17. priority_queue< pa, vector< pa >, greater< pa > >q;
  18. inline void init(int x,int y,int v){
  19. e[++tot].y=y;
  20. e[tot].next=head[x];
  21. e[tot].v=v;
  22. head[x]=tot;
  23. }
  24. inline int ge(int x,int y,int k){//x行,y列,在斜线的左(1)右(2);返回格子的编号
  25. return *(x-)*(m-)+*(y-)+k;
  26. }
  27. /*
  28. 事实上如果按照从上到下从左到右来编号,在输入时的块编号是有规律的;
  29. 不一定要像上面一样这样找格子编号;
  30. */
  31. void doit(){
  32. memset(dis,,sizeof(dis));
  33. int x,y;
  34. dis[s]=;
  35. q.push(make_pair(,s));
  36. while(!q.empty()){
  37. x=q.top().second;
  38. q.pop();
  39. if(vis[x]){
  40. continue;
  41. }
  42. vis[x]=;
  43. for(int i=head[x];i;i=e[i].next){
  44. y=e[i].y;
  45. if(dis[y]>dis[x]+e[i].v){
  46. dis[y]=dis[x]+e[i].v;
  47. vis[y]=;
  48. q.push(make_pair(dis[y],e[i].y));
  49. }
  50. }
  51. }
  52. }
  53. int main(){
  54. scanf("%d%d",&n,&m);
  55. int v;
  56. t=(m-)*(n-)*+;
  57. s=t-;
  58. for(int i=;i<=n;i++){
  59. for(int j=;j<m;j++){
  60. scanf("%d",&v);
  61. if(i==){
  62. init(s,*j,v);
  63. init(*j,s,v);
  64. }else if(i==n){
  65. init(ge(n-,j,),t,v);
  66. init(t,ge(n-,j,),v);
  67. }else{
  68. init(ge(i-,j,),ge(i,j,),v);
  69. init(ge(i,j,),ge(i-,j,),v);
  70. }
  71. }
  72. }
  73. for(int i=;i<n;i++){
  74. for(int j=;j<=m;j++){
  75. scanf("%d",&v);
  76. if(j==){
  77. init(t,ge(i,,),v);
  78. init(ge(i,,),t,v);
  79. }else if(j==m){
  80. init(ge(i,m-,),s,v);
  81. init(s,ge(i,m-,),v);
  82. }else{
  83. init(ge(i,j-,),ge(i,j,),v);
  84. init(ge(i,j,),ge(i,j-,),v);
  85. }
  86. }
  87. }
  88. for(int i=;i<n;i++){
  89. for(int j=;j<m;j++){
  90. scanf("%d",&v);
  91. init(ge(i,j,),ge(i,j,),v);
  92. init(ge(i,j,),ge(i,j,),v);
  93. }
  94. }
  95. doit();
  96. printf("%d\n",dis[t]);
  97. return ;
  98. }

BZOJ1001: [BeiJing2006]狼抓兔子 (最小割转最短路)的更多相关文章

  1. BZOJ1001 [BeiJing2006]狼抓兔子 最小割 对偶图 最短路

    原文链接http://www.cnblogs.com/zhouzhendong/p/8686871.html 题目传送门 - BZOJ1001 题意 长成上面那样的网格图求最小割. $n,m\leq ...

  2. BZOJ1001: [BeiJing2006]狼抓兔子 [最小割 | 对偶图+spfa]

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 19528  Solved: 4818[Submit][ ...

  3. bzoj1001: [BeiJing2006]狼抓兔子 -- 最小割

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MB Description 现在小朋友们最喜欢的"喜羊羊与灰太狼 ...

  4. BZOJ1001[BeiJing2006]狼抓兔子最小割網絡流

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

  5. BZOJ1001[BeiJing2006]狼抓兔子——最小割

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

  6. 【bzoj1001】[BeiJing2006]狼抓兔子 最小割+对偶图+最短路

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

  7. [bzoj 1001][Beijing2006]狼抓兔子 (最小割+对偶图+最短路)

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

  8. bzoj 1001 [BeiJing2006]狼抓兔子——最小割转最短路

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 #include<cstdio> #include<cstring& ...

  9. BZOJ 1001: [BeiJing2006]狼抓兔子 最小割

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓 ...

随机推荐

  1. CMDB概述(一)

    浅谈ITIL TIL即IT基础架构库(Information Technology Infrastructure Library, ITIL,信息技术基础架构库)由英国政府部门CCTA(Central ...

  2. js布尔值转化

    JavaScript 预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值.转换规则是除了下面六个值被转为false,其他值都视为true. undefined null false 0 Na ...

  3. 可能是是最全的Springboot基础视频分享,告别无视频可学

    一头扎进SpringBoot视频教程 SpringBoot入门 2017年-张志君老师-SpringBoot(新增) 欢迎关注我的微信公众号:"Java面试通关手册" 回复关键字& ...

  4. oracle查看表中数据的大小

    通过从视图 user_segments的字段 bytes中找到 select SUM(bytes)/1024/1024 from user_segments where segment_name='E ...

  5. Linux系统调用、新增系统调用方法【转】

    转自:http://blog.chinaunix.net/uid-25374603-id-3401045.html 说明: 系统调用是内核和应用程序间的接口,应用程序要访问硬件设备和其他操作系统资源, ...

  6. 关于SQLite3 编译及交叉编译的一些问题

    from : http://blog.sina.com.cn/s/blog_5f2e119b0101ibwn.html SQLite3 (http://www.sqlite.org)是一个非常强大的小 ...

  7. android的wake_lock介绍

    Wake Lock是一种锁的机制, 只要有人拿着这个锁,系统就无法进入休眠, 可以被用户态程序和内核获得. 这个锁可以是有超时的或者是没有超时的, 超时的锁会在时间过去以后自动解锁. 如果没有锁了或者 ...

  8. 在Perl中使用Getopt::Long模块来接收用户命令行参数

    我们在linux常常用到一个程序需要加入参数,现在了解一下perl中的有关控制参数的函数.getopt.在linux有的参数有二种形式.一种是–help,另一种是-h.也就是-和–的分别.–表示完整参 ...

  9. elk系列5之syslog的模块使用【转】

    preface rsyslog是CentOs系统自带的的一个日志工具,那么我们就配置logstash来接受rsyslog的日志. logstash的syslog模块 linux-node2上操作log ...

  10. python selenium登陆网易云音乐

    from selenium import webdriver import time driver=webdriver.Chrome() driver.get("http://music.1 ...