问题描述

BZOJ2007

LG2046


题解

发现左上角海拔为 \(0\) ,右上角海拔为 \(1\) 。

上坡要付出代价,下坡没有收益,所以有坡度的路越少越好。

所以海拔为 \(1\) 的点,和海拔为 \(0\) 的点,一定能够在这个网格图中由一条连续的线划分为两个集合。

将一个图中的所有结点划分为两个集合,显然为最小割模型。

又发现是网格图,所以平面图最小割转化为对偶图最短路。


\(\mathrm{Code}\)

不删调试见祖宗

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=500*500+3;
  4. int n,S,T;
  5. int Head[maxn],to[maxn*5],Next[maxn*5],w[maxn*5],tot=1;
  6. int fr[maxn*5];
  7. void add(int x,int y,int z){
  8. fr[++tot]=y,to[tot]=x,Next[tot]=Head[y],Head[y]=tot,w[tot]=z;
  9. }
  10. int id(int x,int y){
  11. return (x-1)*n+y;
  12. }
  13. void Init(void){
  14. scanf("%d",&n);
  15. }
  16. void WestToEast(void){
  17. for(int i=1,x;i<=n;i++){
  18. scanf("%d",&x);
  19. add(id(1,i),S,x);
  20. }
  21. for(int i=2;i<=n;i++){
  22. for(int j=1,x;j<=n;j++){
  23. scanf("%d",&x);
  24. add(id(i,j),id(i-1,j),x);
  25. }
  26. }
  27. for(int i=1,x;i<=n;i++){
  28. scanf("%d",&x);
  29. add(T,id(n,i),x);
  30. }
  31. }
  32. void NorthToSouth(void){
  33. for(int i=1,x;i<=n;i++){
  34. scanf("%d",&x);
  35. add(T,id(i,1),x);
  36. for(int j=2;j<=n;j++){
  37. scanf("%d",&x);
  38. add(id(i,j-1),id(i,j),x);
  39. }
  40. scanf("%d",&x);
  41. add(id(i,n),S,x);
  42. }
  43. }
  44. void EastToWest(void){
  45. for(int i=1,x;i<=n;i++){
  46. scanf("%d",&x);
  47. add(S,id(1,i),x);
  48. }
  49. for(int i=2;i<=n;i++){
  50. for(int j=1,x;j<=n;j++){
  51. scanf("%d",&x);
  52. add(id(i-1,j),id(i,j),x);
  53. }
  54. }
  55. for(int i=1,x;i<=n;i++){
  56. scanf("%d",&x);
  57. add(id(n,i),T,x);
  58. }
  59. }
  60. //n lines
  61. //n+1 every-line
  62. void SouthToNorth(void){
  63. for(int i=1,x;i<=n;i++){
  64. scanf("%d",&x);
  65. add(id(i,1),T,x);
  66. for(int j=2;j<=n;j++){
  67. scanf("%d",&x);
  68. add(id(i,j),id(i,j-1),x);
  69. }
  70. scanf("%d",&x);
  71. add(S,id(i,n),x);
  72. }
  73. }
  74. void debug(){
  75. printf("\n### S = %d\n",S);
  76. printf("### T = %d\n\n",T);
  77. for(int i=2;i<=tot;i++){
  78. printf("*** From %d To %d , val = %d\n",fr[i],to[i],w[i]);
  79. }
  80. }
  81. void Graph_build(void){
  82. S=n*n+1,T=S+1;
  83. WestToEast();
  84. NorthToSouth();
  85. EastToWest();
  86. SouthToNorth();
  87. }
  88. int dis[maxn];
  89. bool vis[maxn];
  90. #define pii(x,y) make_pair(x,y)
  91. void dijkstra(void){
  92. memset(dis,0x3f,sizeof(dis));
  93. priority_queue<pair<int,int> >q;
  94. q.push(pii(0,S));dis[S]=0;
  95. while(!q.empty()){
  96. int x=q.top().second;q.pop();
  97. if(vis[x]) continue;vis[x]=1;
  98. if(x==T) return;
  99. for(int i=Head[x];i;i=Next[i]){
  100. int y=to[i];
  101. if(dis[y]>dis[x]+w[i]){
  102. dis[y]=dis[x]+w[i];
  103. q.push(pii(-dis[y],y));
  104. }
  105. }
  106. }
  107. }
  108. void Work(void){
  109. Graph_build();
  110. #ifndef ONLINE_JUDGE
  111. // debug();
  112. #endif
  113. dijkstra();
  114. printf("%d\n",dis[T]);
  115. }
  116. int main(){
  117. #ifndef ONLINE_JUDEG
  118. // freopen("hzlbn.in","r",stdin);
  119. #endif
  120. Init();
  121. Work();
  122. return 0;
  123. }

BZOJ2007/LG2046 「NOI2010」海拔 平面图最小割转对偶图最短路的更多相关文章

  1. bzoj2007/luoguP2046 海拔(平面图最小割转对偶图最短路)

    bzoj2007/luoguP2046 海拔(平面图最小割转对偶图最短路) 题目描述: bzoj  luogu 题解时间: 首先考虑海拔待定点的$h$都应该是多少 很明显它们都是$0$或$1$,并且所 ...

  2. BZOJ 2007 海拔(平面图最小割转对偶图最短路)

    首先注意到,把一个点的海拔定为>1的数是毫无意义的.实际上,可以转化为把这些点的海拔要么定为0,要么定为1. 其次,如果一个点周围的点的海拔没有和它相同的,那么这个点的海拔也是可以优化的,即把这 ...

  3. 【BZOJ2007】【NOI2010】海拔(最小割,平面图转对偶图,最短路)

    [BZOJ2007][NOI2010]海拔(最小割,平面图转对偶图,最短路) 题面 BZOJ 洛谷 Description YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域. ...

  4. [BZOJ 2007] [Noi2010] 海拔 【平面图最小割(对偶图最短路)】

    题目链接:BZOJ - 2007 题目分析 首先,左上角的高度是 0 ,右下角的高度是 1.那么所有点的高度一定要在 0 与 1 之间.然而选取 [0, 1] 的任何一个实数,都可以用整数 0 或 1 ...

  5. BZOJ1001/LG4001 「ICPC Beijing2006」狼抓兔子 平面图最小割转对偶图最短路

    问题描述 BZOJ1001 LG4001 题解 平面图最小割=对偶图最短路 假设起点和终点间有和其他边都不相交的一条虚边. 如图,平面图的若干条边将一个平面划分为若干个图形,每个图形就是对偶图中的一个 ...

  6. BZOJ2007 [Noi2010]海拔 【平面图最小割转对偶图最短路】

    题目链接 BZOJ2007 题解 这是裸题啊,,要是考试真的遇到就好了 明显是最小割,而且是有来回两个方向 那么原图所有向右的边转为对偶图向下的边 向左的边转为向上 向下转为向左 向上转为向右 然后跑 ...

  7. bzoj1001/luogu4001 狼抓兔子 (最小割/平面图最小割转对偶图最短路)

    平面图转对偶图:先在原图中加一个s->t的边,然后对每个面建一个点,对每条分隔两个面的边加一条连接这两个面对应点的边,边权等于原边权. 然后从刚才加的s->t分割出来的两面对应的两个点跑最 ...

  8. 【Bzoj】1001狼抓兔子(平面图最小割转对偶图最短路)

    YEAH 题目链接 终于做对这道题啦    建图的艰辛难以言表- - 顺便说一句我队列转STL啦 狼抓兔子的地图符合平面图定义,于是将该图转成对偶图并求出对偶图的最短路即可. 这篇博客给了我极大的帮助 ...

  9. bzoj1001平面图最小割转对偶图最短路

    https://www.lydsy.com/JudgeOnline/problem.php?id=1001 很明显的求对偶图的最短路即可(由于特判写错了一直wa = = ) //#pragma com ...

随机推荐

  1. Highlight List View Objects 突出显示列表视图对象

    In this lesson, you will learn how to format data that satisfies the specified criteria. For this pu ...

  2. JS---DOM---元素相关的操作方法

    1. 追加子元素 my$("dv").appendChild(obj); 2. 把新的子元素插入到第一个子元素的前面 my$("dv").insertBefor ...

  3. MySQL Error Log 中IO写入瓶颈的警告分析

    周末在一台MySQL实例上频繁做大批量的写入测试,无意中发现MySQL的errorlog中频繁出现如下的Note:page_cleaner: 1000ms intended loop took *** ...

  4. Redis基础类型常用操作命令

    Redis基础类型常用操作命令 概念:Redis是用C语言开发的一个开源的高性能键值对数据库. 特征: 数据间没有必然的联系 内部采用单线程机制进行工作 高性能 多数据类型支持 字符串类型 Strin ...

  5. python 基础学习笔记(7)--迭送器

    **函数名的运用** - [ ] 函数名是一个变量, 但它是一个特殊的变量, 与括号配合可以执行函数的变量 **函数名的内存地址** ```  def func():  print('666')  p ...

  6. 桶排序(C语言)

    #include <stdio.h> int main(void) { int arr[5]={2,5,1,3,3}; //定义需要排序的数组 int res[6]={0}; //初始化& ...

  7. [主动学习--查询策略] 01 Core-set

    符号定义 主动学习每一次迭代选择的样本数量为一个 budget 训练集中初始无标签数据集记为 unlabeled data,\(\bm{u}^0\) 训练集中初始有标签数据集记为 initial la ...

  8. MVC(实战一)

    一.创建MVC项目 二.界面分布 Content:是存放css文件等,暂时先不考虑. Controllers:重要, 控制层,控制界面显示和界面逻辑的,其实真正业务逻辑层,建议分层出去. Models ...

  9. 【使用篇二】SpringBoot整合SpringDataJPA(18)

    一.pom.xml添加依赖 <dependencies> <!--web--> <dependency> <groupId>org.springfram ...

  10. 利用Python进行数据分析-Pandas(第六部分-数据聚合与分组运算)

    对数据集进行分组并对各组应用一个函数(无论是聚合还是转换),通常是数据分析工作中的重要环节.在将数据集加载.融合.准备好之后,通常是计算分组统计或生成透视表.pandas提供了一个灵活高效的group ...