洛谷2046 NOI2010海拔
QwQ题目太长 这里就不复制了
这个题...算是个比较经典的平面图最小割变成对偶图的最短路了QwQ
首先考虑最小割应该怎么做。
有一个性质,就是每个点的海拔要么是1,要么是0
QwQ不过这个我不会证明啊
那么既然知道了这个性质,我们对于地图上的每个点,实际上就是划分成两个集合,一个是\(1\),一个是\(0\)
那么直接最小割就行了
// luogu-judger-enable-o2
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
const int maxn = 110*110;
const int maxm = 1e6+1e2;
const int inf = 1e9;
int point[maxn];
int nxt[maxm],to[maxm],val[maxm];
int cnt=1;
int h[maxn];
queue<int> q;
int n,m;
int s,t;
void addedge(int x,int y,int w)
{
nxt[++cnt]=point[x];
to[cnt]=y;
val[cnt]=w;
point[x]=cnt;
}
void insert(int x,int y,int w)
{
addedge(x,y,w);
addedge(y,x,0);
}
bool bfs(int s)
{
memset(h,-1,sizeof(h));
h[s]=0;
q.push(s);
while (!q.empty())
{
int x = q.front();
q.pop();
for (int i=point[x];i;i=nxt[i])
{
int p = to[i];
if (val[i]>0 && h[p]==-1)
{
h[p]=h[x]+1;
q.push(p);
}
}
}
if (h[t]==-1) return false;
else return true;
}
int dfs(int x,int low)
{
if (x==t || low==0) return low;
int totflow=0;
for (int i=point[x];i;i=nxt[i])
{
int p = to[i];
if (val[i]>0 && h[p]==h[x]+1)
{
int tmp = dfs(p,min(low,val[i]));
low-=tmp;
totflow+=tmp;
val[i]-=tmp;
val[i^1]+=tmp;
if (low==0) return totflow;
}
}
if (low>0) h[x]=-1;
return totflow;
}
int dinic()
{
int ans=0;
while (bfs(s))
{
ans=ans+dfs(s,inf);
}
return ans;
}
int main()
{
n=read();
n++;
s=1;
t=n*n;
for (int i=1;i<=n;i++)
{
//int now =(i-1)*n;
for (int j=1;j<n;j++)
{
int x = read();
//cout<<x<<endl;
insert((i-1)*n+j,(i-1)*n+j+1,x);
//cout<<(i-1)*n+j<<" "<<(i-1)*n+j+1<<endl;
}
}
for (int i=1;i<n;i++)
for (int j=1;j<=n;j++)
{
int x = read();
insert((i-1)*n+j,i*n+j,x);
}
for (int i=1;i<=n;i++)
{
for (int j=1;j<n;j++)
{
int x = read();
insert((i-1)*n+j+1,(i-1)*n+j,x);
}
}
for (int i=1;i<n;i++)
for (int j=1;j<=n;j++)
{
int x = read();
insert(i*n+j,(i-1)*n+j,x);
}
cout<<dinic()<<endl;
return 0;
}
不过这个最小割的复杂度是爆炸的,显然没法通过这个题,那么我们这时候就需要用到一个很关键的性质了
平面图最小割等于对偶图的最短路
那么什么是对偶图呢?
简单来说,就是把原图的每个封闭面,看成一个点,然后原图的每一种割,对应着新图\(s到t\)的一条路径
但是QwQ这里先留跟个坑,就是关于边的方向的问题....这里还不是很理解呢
转化成新图,建好图之后,直接从\(S\)开始跑最短路,\(dis[t]\)就是答案
一般原图的st和新图的st成对角线的关系
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define pa pair<long long,long long>
#include<queue>
using namespace std;
inline long long read()
{
long long x=0,f=1;char ch=getchar();
while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
const int maxn = 510;
const int N = maxn*maxn;
const int maxm = 2e6+1e2;
int a[maxn][maxn][maxn];
int point[N],nxt[maxm],to[maxm];
int cnt;
int vis[N];
int n,m;
long long dis[N],val[maxm];
priority_queue<pa,vector<pa>,greater<pa> > q;
int s,t;
void addedge(int x,int y,long long w){
nxt[++cnt]=point[x];
to[cnt]=y;
val[cnt]=w;
point[x]=cnt;
}
void splay(int s)
{
memset(vis,0,sizeof(vis));
memset(dis,127/3,sizeof(dis));
//cout<<dis[1]<<endl;
dis[s]=0;
q.push(make_pair(0,s));
while (!q.empty())
{
//cout<<1<<endl;
int x = q.top().second;
q.pop();
//cout<<x<<endl;
if (vis[x]) continue;
vis[x]=1;
for (int i=point[x];i;i=nxt[i])
{
int p = to[i];
if (dis[p]>dis[x]+val[i])
{
dis[p]=dis[x]+val[i];
//cout<<dis[p]<<" "<<p<<endl;
q.push(make_pair(dis[p],p));
//cout<<endl;
}
}
}
}
inline int getnum(int x,int y)
{
if (x==0 || y==n) return t;
if (x==n || y==0 ) return s;
return (x-1)*(n-1)+y;
}
int main()
{
n=read();
n++;
s=N-6;
t=s+1;
for (int i=1;i<=n;i++)
for (int j=1;j<n;j++)
{
long long x=read();
addedge(getnum(i,j),getnum(i-1,j),x);
//cout<<getnum(i,j)<<" "<<getnum(i-1,j)<<endl;
}
for (int i=1;i<n;i++)
for (int j=1;j<=n;j++)
{
long long x = read();
addedge(getnum(i,j-1),getnum(i,j),x);
//cout<<getnum(i,j-1)<<" "<<getnum(i,j)<<endl;
//cout<<x<<endl;
}
for (int i=1;i<=n;i++)
for (int j=1;j<n;j++)
{
long long x=read();
addedge(getnum(i-1,j),getnum(i,j),x);
}
for (int i=1;i<n;i++)
for (int j=1;j<=n;j++)
{
long long x = read();
addedge(getnum(i,j),getnum(i,j-1),x);
}
splay(s);
cout<<dis[t];
return 0;
}
洛谷2046 NOI2010海拔的更多相关文章
- 洛谷$P2046\ [NOI2010]$海拔 网络流+对偶图
正解:网络流+对偶图 解题报告: 传送门$QwQ$ $umm$之前省选前集训的时候叶佬考过?然而这和我依然不会做有什么关系呢$kk$ 昂这题首先要两个结论?第一个是说每个位置的海拔一定是0/1,还一个 ...
- 洛谷P2046 [NOI2010]海拔(最小割,平面图转对偶图)
传送门 不明白为什么大佬们一眼就看出这是最小割…… 所以总而言之这就是一个最小割我也不知道为什么 然后边数太多直接跑会炸,所以要把平面图转对偶图,然后跑一个最短路即可 至于建图……请看代码我实在无能为 ...
- [洛谷P2048] [NOI2010] 超级钢琴
洛谷题目链接:[NOI2010]超级钢琴 题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号 ...
- 洛谷P1447 - [NOI2010]能量采集
Portal Description 给出\(n,m(n,m\leq10^5),\)计算\[ \sum_{i=1}^n \sum_{j=1}^m (2gcd(i,j)-1)\] Solution 简单 ...
- 洛谷 P1954 [NOI2010]航空管制
https://www.luogu.org/problemnew/show/P1954 拓扑排序, 注意到如果正着建图("a出现早于b"=>"a向b连边" ...
- 洛谷 P2048 [NOI2010]超级钢琴 解题报告
P2048 [NOI2010]超级钢琴 题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为 ...
- 洛谷P0248 [NOI2010] 超级钢琴 [RMQ,贪心]
题目传送门 超级钢琴 题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符 ...
- 洛谷P1447 [NOI2010]能量采集(容斥)
传送门 很明显题目要求的东西可以写成$\sum_{i=1}^{n}\sum_{j=1}^m gcd(i,j)*2-1$(一点都不明显) 如果直接枚举肯定爆炸 那么我们设$f[i]$表示存在公因数$i$ ...
- 洛谷 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]$是一个定值,所以我们只要在 ...
随机推荐
- 并发编程之:ThreadLocal
大家好,我是小黑,一个在互联网苟且偷生的农民工. 从前上一期[并发编程之:synchronized] 我们学到要保证在并发情况下对于共享资源的安全访问,就需要用到锁. 但是,加锁通常情况下会让运行效率 ...
- 存储系统管理(二)——Linux系统的swap分区、磁盘加密、磁盘阵列
磁盘驱动器上的空间 , 用作当前未使用部分内存的溢出.这样 , 系统就能在主内存中留出空间用于储存当前正在处理的数据 , 并在系统面临主内存空间不足的风险时提供应急溢出. swap分区的建立: fdi ...
- Mac 安装 Android commandlinetools 各种报错的问题
https://developer.android.com/studio/releases/platform-tools commandlinetools-mac 下载地址 解压后直接运行 sdkma ...
- Java中使用DOM4J来生成xml文件和解析xml文件
一.前言 现在有不少需求,是需要我们解析xml文件中的数据,然后导入到数据库中,当然解析xml文件也有好多种方法,小编觉得还是DOM4J用的最多最广泛也最好理解的吧.小编也是最近需求里遇到了,就来整理 ...
- 【流程】Flowable流程定义总结
背景 近几年,互联网企业从消费互联网向产业互联网转型.在消费互联网时期,企业面对的时C端消费者,而产业互联网面对的是B端用户. 产业互联网涉及方方面面,企业信息化的建设就是B端用户的业务之一,在企业就 ...
- Solon 1.5.29 发布,轻量级 Java 基础开发框架
本次版本主要变化: 增加 captcha-solon-plugin 插件(提供滑块验证与选文字验证能力) 插件 sa-token-solon-plugin,升级 sa-token 为 1.26.0 插 ...
- 洛谷P1056——排座椅(模拟,贪心,排序)
https://www.luogu.org/problem/show?pid=1056 题目描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情.不过,班主任小雪发 ...
- DEM数据全国各省的裁剪与分享(30m、90m、250m、1000m)
1.简介: 数字高程模型(Digital Elevation Model),简称DEM,是通过有限的地形高程数据实现对地面地形的数字化模拟. 这次分享的数据是全国34个省份的DEM裁剪数据,一共有6期 ...
- PHP的rar解压读取扩展包学习
作为压缩解压方面的扩展学习,两大王牌压缩格式 rar 和 zip 一直是计算机领域的压缩终结者.rar 格式的压缩包是 Windows 系统中有接近统治地位的存在,今天我们学习的 PHP 扩展就是针对 ...
- 在PHP中操作临时文件
关于文件相关的操作,想必大家已经非常了解了,在将来我们刷到手册中相关的文件操作函数时也会进行详细的讲解.今天,我们先来了解一下在 PHP 中关于临时文件相关的一些内容. 获取 PHP 的默认临时创建文 ...