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市看作 一个正方形,每一个区域也可看 ...
随机推荐
- OGNL概述
-------------------siwuxie095 OGNL 概述 1.OGNL 即 Object-Graph Navigation Language,对象图导航语言, 它是一个应用于 Jav ...
- jQuery的基础dom和css操作
1.元素以及内容操作 $(function () { // alert($("a").html()); // 获取元素中间的html内容,包括标签和文本内容 // alert($( ...
- Java 设计模式系列(十八)备忘录模式(Memento)
Java 设计模式系列(十八)备忘录模式(Memento) 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式.备忘录对象是一个用来存储另外一个对象内部状态 ...
- 使用类加载器加载配置文件/getClassLoader().getResourceAsStream()
加载配置文件的两种方式; 1. 2. 两者相比,第一种方式更为方便,因为文件目录发生改变就会找不到.
- SpringCloud之服务注册-eureka
类似于DUBBO 的zookeeper, SpringCloud本身提供一套服务注册中心--eureka 与zookeeper的区别在于 1:zookeeper本身就是一个应用,安装即可用:eurek ...
- [GO] go使用etcd和watch方法进行实时的配置变更
监控代码 package main import ( "go.etcd.io/etcd/clientv3" "time" "fmt" &qu ...
- 【转】java.sql.SQLException: statement is closed语句被关闭 druid连接池报错
我之前在用druid 1.0.28版本也出现过这个问题, 现象就是: 报这个错的时候, 往往会出现在一条毫无错误的sql执行上报错, sql放到数据库上执行或者单独拎出来执行完全没问题, 但是为什么 ...
- SGU 194 Reactor Cooling (有容量和下界的可行流)
题意:给定上一个有容量和下界的网络,让你求出一组可行解. 析:先建立一个超级源点 s 和汇点 t ,然后在输入时记录到每个结点的下界的和,建边的时候就建立c - b的最后再建立 s 和 t , 在建立 ...
- Android AR平台
ARToolkit:https://baike.baidu.com/item/ARToolkit/5726883?fr=aladdin Vuforia:搭建Android AR技术开发环境(Aqume ...
- hdu2364之BFS
Escape Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...