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市看作 一个正方形,每一个区域也可看 ...
随机推荐
- FILTER:progid:DXImageTransform.Microsoft.Gradient使用
FILTER:progid:DXImageTransform.Microsoft.Gradient使用 语法: filter:progid:DXImageTransform.Microsoft.Gra ...
- new Class{}形式
先看下面代码 Test.java public class Test { public static void main(String[] args) { A a=new A() { @Overrid ...
- Connection Lifetime
Connection Lifetime作用(数据库群集) 2010-11-12 14:17:01| 分类: sql server 2005 | 标签: |字号大http://xiangzhang ...
- curl模拟多线程抓取网页(优化)
通过上篇文章清楚了通过curl_multi_*函数可以一次请求多个url,但是也留下了问题,就是结果要等所有数据请求结束一起返回,才能逐个处理数据.优化代码,使先成功请求的url先返回处理结果,而不是 ...
- unidac 访问sql server 字符查询参数失效问题及解决办法
在帮朋友调试kbmmw 服务器的时候,发现用uindac 访问sql server作为后台时,碰见一个问题. 具体如下: cx.Close; cx.sql.add('select * from T w ...
- 无脑无负担网站架构-- Application Request Route的一些应用
首先作为一个.net 程序员,多数情况你懒的整什么架构啊.框架啊.还有那命令行的linux,别说linux也有桌面,那个桌面用起来更让人抓狂,一直不明白居然有人说喜欢上linux的命令行,装B还是SB ...
- git 回退到某个特定提交
1.先用git log commit aba290c570d3894f4f39a1fdf52aa512c0231525 Author: huzhengbo <@qq.com> Date: ...
- python的return
关于python的return用法,在stackoverflow里的问题: Python — return, return None, and no return at all Consider th ...
- 优秀前端工程师必备: 我要一个新窗口: js开新窗的2种姿势
1.<a href="https://www.cnblogs.com/" title="博客园">当前页面打开博客园</a> js代码等 ...
- 20155316 2016-2017-2 《Java程序设计》第6周学习总结
教材学习内容总结 IO操作的目标 从数据源当中读取数据,以及将数据写入到数据目的地当中: I/O的来源地与目的地多种多样 I/O的流向:输入流.输出流.参照物 IO的分类方法 输入流\输出流: 字节流 ...