题目链接

题意分析

首先一看就知道这是一道最小割

这里奉上最小割的代码

#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]海拔的更多相关文章

  1. P2046 [NOI2010]海拔 平面图转对偶图(最小割-》最短路)

    $ \color{#0066ff}{ 题目描述 }$ YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看作一个正方形. ...

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

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

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

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

  4. luogu2046[NOI2010]海拔 对偶图优化

    luogu2046[NOI2010]海拔 对偶图优化 链接 https://www.luogu.org/problemnew/show/P2046 思路 海拔一定是0或者1,而且会有一条01交错的分界 ...

  5. BZOJ 2007: [Noi2010]海拔

    2007: [Noi2010]海拔 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2410  Solved: 1142[Submit][Status] ...

  6. NOI2010海拔

    2007: [Noi2010]海拔 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 1302  Solved: 612[Submit][Status] ...

  7. 图论(对偶图):COGS 470. [NOI2010]海拔

    470. [NOI2010]海拔 ★★★☆   输入文件:altitude.in   输出文件:altitude.out   简单对比 时间限制:2 s   内存限制:512 MB 海拔 [问题描述] ...

  8. B20J_2007_[Noi2010]海拔_平面图最小割转对偶图+堆优化Dij

    B20J_2007_[Noi2010]海拔_平面图最小割转对偶图+堆优化Dij 题意:城市被东西向和南北向的主干道划分为n×n个区域.城市中包括(n+1)×(n+1)个交叉路口和2n×(n+1)条双向 ...

  9. 【BZOJ2007】[Noi2010]海拔 对偶图最短路

    [BZOJ2007][Noi2010]海拔 Description YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看 ...

随机推荐

  1. 关于网页头图标ico的问题

    今天同事问了我一个比较奇怪的问题,对于我来说,可能和编码没什么关系,但是确实是头一次注意到,所以把问题记录了下来,方便以后积累经验. 问题就是: 在本地的网页中设置了头图标 <link rel= ...

  2. 41-邮差送信(dfs)

    邮差送信 (15分)C时间限制:1 毫秒 |  C内存限制:3000 Kb题目内容: 有一个邮递员要在n个城市之间来回送信.但有的城市之间有大路相连而有的没有路.现在要由一个城市到另一个城市送信,中途 ...

  3. a标签href="javascript:;"

    //点击a链接,执行一段js代码 <!DOCTYPE html> <html> <head> <title></title> </he ...

  4. std::time(0)找不到

    http://zh.cppreference.com/w/cpp/chrono/c/time #include <ctime> isnan找不到 http://en.cppreferenc ...

  5. Java中二叉排序树

    package com.ietree.basic.datastructure.tree; import java.util.ArrayDeque; import java.util.ArrayList ...

  6. mongon命令(转)

    原文:http://www.cnblogs.com/blueness-sunshine/p/6139092.html   连接mongodb: mongo -u --authenticationDat ...

  7. Javascript 知识遗漏点梳理。

    先说一下我之前学习Javascript的学习经历,然后就是最近几天学到以前没有注意的知识遗漏点. 1.之前的学习经历和方法: 最开始是看了Javascript DOM编程与艺术这本书,把慕课网上的&l ...

  8. Java学习总结——常见问题及解决方法

    CYTX项目开发中遇到的问题及解决方法 Android开发各类常见错误解决方案: 使用Android Studio遇到的问题及解决过程 登录注册部分问题及解决: 1.问题:"No targe ...

  9. (字符串) Hidden String -- HDU -- 5311

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=5311 Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  10. (DP)uva 10036 Problem C: Divisibility

    链接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=88171#problem/F 代码: #include <cstdio> ...