题意

https://www.lydsy.com/JudgeOnline/problem.php?id=2007

思路

首先可以发现一个结论,每个位置的海拔只有能是 \(0\) 和 \(1\) ,然后这道题就是求以人流量为边权的最小割。

直接用网络流求最小割似乎会T 。但这张图是个平面图,可以转化成它的对偶图求最短路,唯一要注意的一点是,这张无向图每条边正走和反走边权是不同的,于是转化对偶图的时候把每条边逆时针翻转 \(90\) 度即可,正确性讲不清楚,需要感性理解。

代码

#include<bits/stdc++.h>
#define FOR(i,x,y) for(int i=(x),i##END=(y);i<=i##END;++i)
#define DOR(i,x,y) for(int i=(x),i##END=(y);i>=i##END;--i)
template<typename T,typename _T>inline bool chk_min(T &x,const _T y){return y<x?x=y,1:0;}
template<typename T,typename _T>inline bool chk_max(T &x,const _T y){return x<y?x=y,1:0;}
typedef long long ll;
const int N=505;
template<const int N,const int M,typename T>struct LinkedList
{
int head[N],nxt[M],tot;T to[M];
LinkedList(){clear();}
T &operator [](const int x){return to[x];}
void clear(){memset(head,-1,sizeof(head)),tot=0;}
void add(int u,T v){to[tot]=v,nxt[tot]=head[u],head[u]=tot++;}
#define EOR(i,G,u) for(int i=G.head[u];~i;i=G.nxt[i])
};
template<typename T>struct Heap
{
T a[4*N*N];int n;
Heap(){clear();}
void clear(){n=0;}
bool empty(){return n==0;}
T top(){return a[1];}
void push(T val)
{
int x=++n;
for(int y;(y=(x>>1));x=y)
{
if(val<a[y])a[x]=a[y];
else break;
}
a[x]=val;
}
void pop()
{
int x=1;T val=a[n--];
for(int y;(y=(x<<1))<=n;x=y)
{
if(y+1<=n&&a[y+1]<a[y])y++;
if(a[y]<val)a[x]=a[y];
else break;
}
a[x]=val;
}
};
struct edge{int to,cost;};
struct node
{
int at,path;
bool operator <(const node &_)const{return path<_.path;}
}; LinkedList<N*N,4*N*N,edge>G;
Heap<node>H;
int dis[N*N];
int n,S,T; inline int Hs(int x,int y)
{
if(y<1||x>n)return S;
if(y>n||x<1)return T;
return (x-1)*n+y;
} int dijkstra()
{
FOR(i,1,T)dis[i]=1e9;
H.clear();
H.push((node){S,dis[S]=0});
while(!H.empty())
{
node now=H.top();H.pop();
int u=now.at;
if(dis[u]<now.path)continue;
EOR(i,G,u)
{
int v=G[i].to,w=G[i].cost;
if(chk_min(dis[v],dis[u]+w))
H.push((node){v,dis[v]});
}
}
return dis[T];
} int main()
{
scanf("%d",&n);
S=n*n+1,T=n*n+2;
FOR(i,1,n+1)FOR(j,1,n)
{
int w;scanf("%d",&w);
G.add(Hs(i,j),(edge){Hs(i-1,j),w});
}
FOR(i,1,n)FOR(j,0,n)
{
int w;scanf("%d",&w);
G.add(Hs(i,j),(edge){Hs(i,j+1),w});
}
FOR(i,0,n)FOR(j,1,n)
{
int w;scanf("%d",&w);
G.add(Hs(i,j),(edge){Hs(i+1,j),w});
}
FOR(i,1,n)FOR(j,1,n+1)
{
int w;scanf("%d",&w);
G.add(Hs(i,j),(edge){Hs(i,j-1),w});
}
printf("%d\n",dijkstra());
return 0;
}

最新文章

  1. Unity3D 接完GVR SDk后如何插入自己的java代码
  2. 为jQuery添加Webkit的触摸方法支持
  3. 使用js实现显示系统当前时间并实现倒计时功能并触发模态框(遮罩)功能
  4. Javascript学习笔记:3种检测变量类型的方法
  5. java单例-积木系列
  6. 查看本机ip
  7. SQLite不支持的SQL语法总结
  8. 软件工程 --- Pair Project: Elevator Scheduler [电梯调度算法的实现和测试] [附加题]
  9. 2015第43周一solr相关概念
  10. codeforces --- 115A
  11. JS-鼠标滚轮事件 和 阻止默认行为
  12. ABP官方文档翻译 3.8 数据过滤器
  13. table_rows查询优化
  14. C#_方法的重载
  15. HDU1069(还是dp基础)
  16. 常用jquery记录
  17. LA 3027 合作网络
  18. [ 原创 ] Java基础9--final throw throws finally的区别
  19. Excel 2010 对号叉号怎么打出来
  20. 《IT项目经理成长手记》

热门文章

  1. Oracle数据库rownum用法集锦
  2. 打开IDEA的更新选项,如何打开IDEA更新弹窗
  3. .NET 跨域问题解决
  4. Appium 自动化测试配置wda的两种方式。
  5. placeholder和assign速度对比
  6. python网络编程-2
  7. 信号量(Posix)
  8. Python odoo中嵌入html简单的分页功能
  9. java8新特性—四大内置核心接口
  10. yum 安装apache php mysql