P2046 [NOI2010]海拔
题目链接
题意分析
首先一看就知道这是一道最小割
这里奉上最小割的代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<list>
#include<set>
#include<deque>
#include<vector>
#include<ctime>
#define ll long long
#define inf 0x7fffffff
#define N 500008
#define IL inline
#define M 5008611
#define D double
#define ull unsigned long long
#define R register
using namespace std;
template<typename T>IL void read(T &_)
{
T __=0,___=1;char ____=getchar();
while(!isdigit(____)) {if(____=='-') ___=0;____=getchar();}
while(isdigit(____)) {__=(__<<1)+(__<<3)+____-'0';____=getchar();}
_=___ ? __:-__;
}
/*-------------OI使我快乐-------------*/
int n,tot=1,S,T;
int to[M],nex[M],head[M],w[M];
int dep[M],cur[M];
ll ans;
queue<int> Q;
IL int id(int x,int y){return (x-1)*n+y;}
IL void add(int x,int y,int z)
{to[++tot]=y;nex[tot]=head[x];head[x]=tot;w[tot]=z;
swap(x,y);to[++tot]=y;nex[tot]=head[x];head[x]=tot;w[tot]=0;}
IL bool bfs()
{
for(R int i=1;i<=T;++i) dep[i]=0;
dep[S]=1;Q.push(S);
for(;!Q.empty();)
{
int u=Q.front();Q.pop();
for(R int i=head[u];i;i=nex[i])
{
int v=to[i];
if(w[i]>0&&dep[v]==0)
{
dep[v]=dep[u]+1;Q.push(v);
}
}
}
return dep[T]!=0;
}
IL int dfs(int now,int res)
{
if(now==T||!res) return res;
for(R int &i=cur[now];i;i=nex[i])
{
int v=to[i];
if(w[i]>0&&dep[v]==dep[now]+1)
{
int have=dfs(v,min(w[i],res));
if(have>0)
{
w[i]-=have;w[i^1]+=have;return have;
}
}
}
return 0;
}
IL void Dinic()
{
while(bfs())
{
// puts("now now now");
for(R int i=1;i<=T;++i) cur[i]=head[i];
int d=dfs(S,inf);
while(d) ans+=1ll*d,d=dfs(S,inf);
}
}
int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
read(n);++n;S=1;T=n*n;
for(R int i=1;i<=n;++i)
for(R int j=1,x;j<n;++j)
read(x),add(id(i,j),id(i,j+1),x);
for(R int i=1;i<n;++i)
for(R int j=1,x;j<=n;++j)
read(x),add(id(i,j),id(i+1,j),x);
for(R int i=1;i<=n;++i)
for(R int j=1,x;j<n;++j)
read(x),add(id(i,j+1),id(i,j),x);
for(R int i=1;i<n;++i)
for(R int j=1,x;j<=n;++j)
read(x),add(id(i+1,j),id(i,j),x);
Dinic();
printf("%lld\n",ans);
// fclose(stdin);
// fclose(stdout);
return 0;
}
但是直接平面图上跑最小割会\(TLE\)
思考一下 平面图上最小割模型就是一条分界线
我们思考可以转换为最短路问题
那么就是平面图转对偶图
一天左下角到右上角经过的就是分界线
例如说 画上箭头就是这样
然后我们跑最短路就可以了
CODE:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<list>
#include<set>
#include<deque>
#include<vector>
#include<ctime>
#define ll long long
#define inf 0x7fffffff
#define N 500008
#define IL inline
#define M 5008611
#define D double
#define Pa pair<long long,int>
#define R register
using namespace std;
template<typename T>IL void read(T &_)
{
T __=0,___=1;char ____=getchar();
while(!isdigit(____)) {if(____=='-') ___=0;____=getchar();}
while(isdigit(____)) {__=(__<<1)+(__<<3)+____-'0';____=getchar();}
_=___ ? __:-__;
}
/*-------------OI使我快乐-------------*/
int n,tot,S,T;
int to[M],nex[M],head[M],w[M];
ll dis[M];bool vis[M];
priority_queue<Pa,vector<Pa >,greater<Pa > > Q;
IL int id(int x,int y){return (x-1)*n+y;}
IL void add(int x,int y,int z)
{to[++tot]=y;nex[tot]=head[x];head[x]=tot;w[tot]=z;}
IL void Dijkstra()
{
memset(dis,0x3f,sizeof dis);Q.push(make_pair(dis[S]=0,S));
for(;!Q.empty();)
{
int u=Q.top().second;Q.pop();
if(vis[u]) continue;vis[u]=1;
for(R int i=head[u];i;i=nex[i])
{
int v=to[i];
if(dis[v]>dis[u]+w[i])
Q.push(make_pair(dis[v]=dis[u]+w[i],v));
}
}
}
int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
read(n);S=n*n+1;T=n*n+2;
for(R int i=1;i<=n+1;++i)
for(R int j=1,x;j<=n;++j)
{
read(x);
if(i==1) add(id(i,j),T,x);
else if(i==n+1) add(S,id(i-1,j),x);
else add(id(i,j),id(i-1,j),x);
}
for(R int i=1;i<=n;++i)
for(R int j=1,x;j<=n+1;++j)
{
read(x);
if(j==1) add(S,id(i,j),x);
else if(j==n+1) add(id(i,j-1),T,x);
else add(id(i,j-1),id(i,j),x);
}
for(R int i=1;i<=n+1;++i)
for(R int j=1,x;j<=n;++j)
{
read(x);
if(i==1) add(T,id(i,j),x);
else if(i==n+1) add(id(i-1,j),S,x);
else add(id(i-1,j),id(i,j),x);
}
for(R int i=1;i<=n;++i)
for(R int j=1,x;j<=n+1;++j)
{
read(x);
if(j==1) add(id(i,j),S,x);
else if(j==n+1) add(T,id(i,j-1),x);
else add(id(i,j),id(i,j-1),x);
}
Dijkstra();
printf("%lld\n",dis[T]);
// fclose(stdin);
// fclose(stdout);
return 0;
}
HEOI 2019 RP++
P2046 [NOI2010]海拔的更多相关文章
- P2046 [NOI2010]海拔 平面图转对偶图(最小割-》最短路)
$ \color{#0066ff}{ 题目描述 }$ YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看作一个正方形. ...
- 洛谷$P2046\ [NOI2010]$海拔 网络流+对偶图
正解:网络流+对偶图 解题报告: 传送门$QwQ$ $umm$之前省选前集训的时候叶佬考过?然而这和我依然不会做有什么关系呢$kk$ 昂这题首先要两个结论?第一个是说每个位置的海拔一定是0/1,还一个 ...
- 洛谷P2046 [NOI2010]海拔(最小割,平面图转对偶图)
传送门 不明白为什么大佬们一眼就看出这是最小割…… 所以总而言之这就是一个最小割我也不知道为什么 然后边数太多直接跑会炸,所以要把平面图转对偶图,然后跑一个最短路即可 至于建图……请看代码我实在无能为 ...
- luogu2046[NOI2010]海拔 对偶图优化
luogu2046[NOI2010]海拔 对偶图优化 链接 https://www.luogu.org/problemnew/show/P2046 思路 海拔一定是0或者1,而且会有一条01交错的分界 ...
- BZOJ 2007: [Noi2010]海拔
2007: [Noi2010]海拔 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2410 Solved: 1142[Submit][Status] ...
- NOI2010海拔
2007: [Noi2010]海拔 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 1302 Solved: 612[Submit][Status] ...
- 图论(对偶图):COGS 470. [NOI2010]海拔
470. [NOI2010]海拔 ★★★☆ 输入文件:altitude.in 输出文件:altitude.out 简单对比 时间限制:2 s 内存限制:512 MB 海拔 [问题描述] ...
- B20J_2007_[Noi2010]海拔_平面图最小割转对偶图+堆优化Dij
B20J_2007_[Noi2010]海拔_平面图最小割转对偶图+堆优化Dij 题意:城市被东西向和南北向的主干道划分为n×n个区域.城市中包括(n+1)×(n+1)个交叉路口和2n×(n+1)条双向 ...
- 【BZOJ2007】[Noi2010]海拔 对偶图最短路
[BZOJ2007][Noi2010]海拔 Description YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看 ...
随机推荐
- DNS BIND之rndc介绍及使用
rndc(Remote Name Domain Controllerr)是一个远程管理bind的工具,通过这个工具可以在本地或者远程了解当前服务器的运行状况,也可以对服务器进行关闭.重载.刷新缓存.增 ...
- iconv-go升级过程中的编译问题
工作项目原因,需要对golang进行升级.升级之后老的iconv-go运行有问题.因为新的golang运行更加严格,所以需要升级iconv-go. 从djimenez/iconv-go 拉下来代码进行 ...
- __slots__(面向对象进阶)
1.__slots__是什么:是一个类变量,变量值可以是列表,元祖,或者可迭代对象,也可以是一个字符串(意味着所有实例只有一个数据属性) 2.引子:使用点来访问属性本质就是在访问类或者对象的__dic ...
- Greeplum 系列(七) 权限管理
Greeplum 系列(七) 权限管理 一.角色管理 Role 分为用户(User)和组(Group),用户有 login 权限,组用来管理用户,一般不会有 login 权限.初始化 gp 时创建了一 ...
- php redis 单例模式
单例模式思想其实很简单 首先 有一个实例的静态变量 构造方法和克隆方法设置为私有,防止外部直接new 提供一个获取实例的静态方法 代码如下: class Redis { private static ...
- 编译hadoop的libhdfs.a
进入hadoop-hdfs-project/hadoop-hdfs/src目录,执行cmake以生成Makefile文件. 如果遇到如下的错误: ~/hadoop-2.7.1-src/hadoop-h ...
- dojoConfig包的配置(7/26号夜)
主页代码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> ...
- jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version
jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support . 在更新的 2.0 版本中,将不再支持 IE 6/7/8. ...
- GPU的历史:从固定管线到可编程管线再到通用计算平台
开始的时候GPU不能编程,也叫固定管线的,就是把数据按照固定的通路走完. 和CPU同样作为计算处理器,顺理成章就出来了可编程的GPU,但是那时候想在GPU上编程可不是容易的事,你只能使用GPU汇编来写 ...
- 【JAVA 学习笔记1】代码注释
在JAVA中支持单行注释和多行注释 1.单行注释,只要在注释的一行代码中加上双斜杠即可 例如: // int a=2,b=4,c=8; 2.多行注释,在开始位置加上/* 结束位置加上*/ 例如 /* ...