QwQ题目太长 这里就不复制了

题目

这个题...算是个比较经典的平面图最小割变成对偶图的最短路了QwQ

首先考虑最小割应该怎么做。

有一个性质,就是每个点的海拔要么是1,要么是0

QwQ不过这个我不会证明啊

那么既然知道了这个性质,我们对于地图上的每个点,实际上就是划分成两个集合,一个是\(1\),一个是\(0\)

那么直接最小割就行了

  1. // luogu-judger-enable-o2
  2. #include<iostream>
  3. #include<cstdio>
  4. #include<algorithm>
  5. #include<cstring>
  6. #include<cmath>
  7. #include<queue>
  8. using namespace std;
  9. inline int read()
  10. {
  11. int x=0,f=1;char ch=getchar();
  12. while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
  13. while (isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
  14. return x*f;
  15. }
  16. const int maxn = 110*110;
  17. const int maxm = 1e6+1e2;
  18. const int inf = 1e9;
  19. int point[maxn];
  20. int nxt[maxm],to[maxm],val[maxm];
  21. int cnt=1;
  22. int h[maxn];
  23. queue<int> q;
  24. int n,m;
  25. int s,t;
  26. void addedge(int x,int y,int w)
  27. {
  28. nxt[++cnt]=point[x];
  29. to[cnt]=y;
  30. val[cnt]=w;
  31. point[x]=cnt;
  32. }
  33. void insert(int x,int y,int w)
  34. {
  35. addedge(x,y,w);
  36. addedge(y,x,0);
  37. }
  38. bool bfs(int s)
  39. {
  40. memset(h,-1,sizeof(h));
  41. h[s]=0;
  42. q.push(s);
  43. while (!q.empty())
  44. {
  45. int x = q.front();
  46. q.pop();
  47. for (int i=point[x];i;i=nxt[i])
  48. {
  49. int p = to[i];
  50. if (val[i]>0 && h[p]==-1)
  51. {
  52. h[p]=h[x]+1;
  53. q.push(p);
  54. }
  55. }
  56. }
  57. if (h[t]==-1) return false;
  58. else return true;
  59. }
  60. int dfs(int x,int low)
  61. {
  62. if (x==t || low==0) return low;
  63. int totflow=0;
  64. for (int i=point[x];i;i=nxt[i])
  65. {
  66. int p = to[i];
  67. if (val[i]>0 && h[p]==h[x]+1)
  68. {
  69. int tmp = dfs(p,min(low,val[i]));
  70. low-=tmp;
  71. totflow+=tmp;
  72. val[i]-=tmp;
  73. val[i^1]+=tmp;
  74. if (low==0) return totflow;
  75. }
  76. }
  77. if (low>0) h[x]=-1;
  78. return totflow;
  79. }
  80. int dinic()
  81. {
  82. int ans=0;
  83. while (bfs(s))
  84. {
  85. ans=ans+dfs(s,inf);
  86. }
  87. return ans;
  88. }
  89. int main()
  90. {
  91. n=read();
  92. n++;
  93. s=1;
  94. t=n*n;
  95. for (int i=1;i<=n;i++)
  96. {
  97. //int now =(i-1)*n;
  98. for (int j=1;j<n;j++)
  99. {
  100. int x = read();
  101. //cout<<x<<endl;
  102. insert((i-1)*n+j,(i-1)*n+j+1,x);
  103. //cout<<(i-1)*n+j<<" "<<(i-1)*n+j+1<<endl;
  104. }
  105. }
  106. for (int i=1;i<n;i++)
  107. for (int j=1;j<=n;j++)
  108. {
  109. int x = read();
  110. insert((i-1)*n+j,i*n+j,x);
  111. }
  112. for (int i=1;i<=n;i++)
  113. {
  114. for (int j=1;j<n;j++)
  115. {
  116. int x = read();
  117. insert((i-1)*n+j+1,(i-1)*n+j,x);
  118. }
  119. }
  120. for (int i=1;i<n;i++)
  121. for (int j=1;j<=n;j++)
  122. {
  123. int x = read();
  124. insert(i*n+j,(i-1)*n+j,x);
  125. }
  126. cout<<dinic()<<endl;
  127. return 0;
  128. }

不过这个最小割的复杂度是爆炸的,显然没法通过这个题,那么我们这时候就需要用到一个很关键的性质了

平面图最小割等于对偶图的最短路

那么什么是对偶图呢?

简单来说,就是把原图的每个封闭面,看成一个点,然后原图的每一种割,对应着新图\(s到t\)的一条路径

但是QwQ这里先留跟个坑,就是关于边的方向的问题....这里还不是很理解呢

转化成新图,建好图之后,直接从\(S\)开始跑最短路,\(dis[t]\)就是答案

一般原图的st和新图的st成对角线的关系

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<cmath>
  6. #define pa pair<long long,long long>
  7. #include<queue>
  8. using namespace std;
  9. inline long long read()
  10. {
  11. long long x=0,f=1;char ch=getchar();
  12. while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
  13. while (isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
  14. return x*f;
  15. }
  16. const int maxn = 510;
  17. const int N = maxn*maxn;
  18. const int maxm = 2e6+1e2;
  19. int a[maxn][maxn][maxn];
  20. int point[N],nxt[maxm],to[maxm];
  21. int cnt;
  22. int vis[N];
  23. int n,m;
  24. long long dis[N],val[maxm];
  25. priority_queue<pa,vector<pa>,greater<pa> > q;
  26. int s,t;
  27. void addedge(int x,int y,long long w){
  28. nxt[++cnt]=point[x];
  29. to[cnt]=y;
  30. val[cnt]=w;
  31. point[x]=cnt;
  32. }
  33. void splay(int s)
  34. {
  35. memset(vis,0,sizeof(vis));
  36. memset(dis,127/3,sizeof(dis));
  37. //cout<<dis[1]<<endl;
  38. dis[s]=0;
  39. q.push(make_pair(0,s));
  40. while (!q.empty())
  41. {
  42. //cout<<1<<endl;
  43. int x = q.top().second;
  44. q.pop();
  45. //cout<<x<<endl;
  46. if (vis[x]) continue;
  47. vis[x]=1;
  48. for (int i=point[x];i;i=nxt[i])
  49. {
  50. int p = to[i];
  51. if (dis[p]>dis[x]+val[i])
  52. {
  53. dis[p]=dis[x]+val[i];
  54. //cout<<dis[p]<<" "<<p<<endl;
  55. q.push(make_pair(dis[p],p));
  56. //cout<<endl;
  57. }
  58. }
  59. }
  60. }
  61. inline int getnum(int x,int y)
  62. {
  63. if (x==0 || y==n) return t;
  64. if (x==n || y==0 ) return s;
  65. return (x-1)*(n-1)+y;
  66. }
  67. int main()
  68. {
  69. n=read();
  70. n++;
  71. s=N-6;
  72. t=s+1;
  73. for (int i=1;i<=n;i++)
  74. for (int j=1;j<n;j++)
  75. {
  76. long long x=read();
  77. addedge(getnum(i,j),getnum(i-1,j),x);
  78. //cout<<getnum(i,j)<<" "<<getnum(i-1,j)<<endl;
  79. }
  80. for (int i=1;i<n;i++)
  81. for (int j=1;j<=n;j++)
  82. {
  83. long long x = read();
  84. addedge(getnum(i,j-1),getnum(i,j),x);
  85. //cout<<getnum(i,j-1)<<" "<<getnum(i,j)<<endl;
  86. //cout<<x<<endl;
  87. }
  88. for (int i=1;i<=n;i++)
  89. for (int j=1;j<n;j++)
  90. {
  91. long long x=read();
  92. addedge(getnum(i-1,j),getnum(i,j),x);
  93. }
  94. for (int i=1;i<n;i++)
  95. for (int j=1;j<=n;j++)
  96. {
  97. long long x = read();
  98. addedge(getnum(i,j),getnum(i,j-1),x);
  99. }
  100. splay(s);
  101. cout<<dis[t];
  102. return 0;
  103. }

洛谷2046 NOI2010海拔的更多相关文章

  1. 洛谷$P2046\ [NOI2010]$海拔 网络流+对偶图

    正解:网络流+对偶图 解题报告: 传送门$QwQ$ $umm$之前省选前集训的时候叶佬考过?然而这和我依然不会做有什么关系呢$kk$ 昂这题首先要两个结论?第一个是说每个位置的海拔一定是0/1,还一个 ...

  2. 洛谷P2046 [NOI2010]海拔(最小割,平面图转对偶图)

    传送门 不明白为什么大佬们一眼就看出这是最小割…… 所以总而言之这就是一个最小割我也不知道为什么 然后边数太多直接跑会炸,所以要把平面图转对偶图,然后跑一个最短路即可 至于建图……请看代码我实在无能为 ...

  3. [洛谷P2048] [NOI2010] 超级钢琴

    洛谷题目链接:[NOI2010]超级钢琴 题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号 ...

  4. 洛谷P1447 - [NOI2010]能量采集

    Portal Description 给出\(n,m(n,m\leq10^5),\)计算\[ \sum_{i=1}^n \sum_{j=1}^m (2gcd(i,j)-1)\] Solution 简单 ...

  5. 洛谷 P1954 [NOI2010]航空管制

    https://www.luogu.org/problemnew/show/P1954 拓扑排序, 注意到如果正着建图("a出现早于b"=>"a向b连边" ...

  6. 洛谷 P2048 [NOI2010]超级钢琴 解题报告

    P2048 [NOI2010]超级钢琴 题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为 ...

  7. 洛谷P0248 [NOI2010] 超级钢琴 [RMQ,贪心]

    题目传送门 超级钢琴 题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符 ...

  8. 洛谷P1447 [NOI2010]能量采集(容斥)

    传送门 很明显题目要求的东西可以写成$\sum_{i=1}^{n}\sum_{j=1}^m gcd(i,j)*2-1$(一点都不明显) 如果直接枚举肯定爆炸 那么我们设$f[i]$表示存在公因数$i$ ...

  9. 洛谷 P2048 [NOI2010]超级钢琴(优先队列,RMQ)

    传送门 我们定义$(p,l,r)=max\{sum[t]-sum[p-1],p+l-1\leq t\leq p+r-1 \}$ 那么因为对每一个$p$来说$sum[p-1]$是一个定值,所以我们只要在 ...

随机推荐

  1. MySQL-SQL基础-DCL

    mysql> grant select,insert on sakila.* to 'zl'@'localhost' identified by '123'; Query OK, 0 rows ...

  2. constexpr-C++11

    constexpr和常量表达式 常量表达式(const expression)是指值不会改变并且在编译过程就能得到计算结果的表达式.显然,字面值属于常量表达式,用常量表达式初始化的const对象也是常 ...

  3. JS002. map( ) 和 filter( ) 的区别和实际应用场景(递归函数、深度优先搜索DFS)

    在开发过程中难免会碰到省市区级联的操作,一般后端人员是不愿意将中文储存在数据库的. 由于应用页面较多,我们在通过区域Code写查字典函数时应该注意函数的 时间复杂度 / 空间复杂度. 如果用三层for ...

  4. Dubbo No provider问题排查思路

    本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star. 不想看字的同学可直接划到底部查看思维导图 问题分析 使用过Dubbo的朋友很多都碰到过如下报错 ...

  5. linux中花括弧大括号用法

    {1,3,5}   ==  1 3 5 {1..5}   ==  1  2  3  4  5 {a..e}  ==  a b c d e {A..z} {1..50..2} {1..50..3} {1 ...

  6. MapReduce 示例:减少 Hadoop MapReduce 中的侧连接

    摘要:在排序和reducer 阶段,reduce 侧连接过程会产生巨大的网络I/O 流量,在这个阶段,相同键的值被聚集在一起. 本文分享自华为云社区<MapReduce 示例:减少 Hadoop ...

  7. 获取docker镜像的tag列表

    已nginx为例 命令如下 wget -q https://registry.hub.docker.com/v1/repositories/nginx/tags -O - | sed -e 's/[] ...

  8. Dockerfile 自动制作 Docker 镜像(三)—— 镜像的分层与 Dockerfile 的优化

    Dockerfile 自动制作 Docker 镜像(三)-- 镜像的分层与 Dockerfile 的优化 前言 a. 本文主要为 Docker的视频教程 笔记. b. 环境为 CentOS 7.0 云 ...

  9. POJ——3278 Catch That Cow(BFS队列)

    相比于POJ2251的三维BFS,这道题做法思路完全相同且过程更加简单,也不需要用结构体,check只要判断vis和左右边界的越界情况就OK. 记得清空队列,其他没什么好说的. #include< ...

  10. stderr,stdin,stdout相关

    转载请保留原作者. 目录 一.stdin和stdout 1.意义 2.缓冲 2.1.scanf的缓冲问题 2.2.fflush 3.freopen 二.stderr 1.输出方法 2.默认缓冲 一.s ...