题目链接

BZOJ2007

题解

这是裸题啊,,要是考试真的遇到就好了

明显是最小割,而且是有来回两个方向

那么原图所有向右的边转为对偶图向下的边

向左的边转为向上

向下转为向左

向上转为向右

然后跑一遍最短路即可

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<cmath>
#include<map>
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define mp(a,b) make_pair<LL,int>(a,b)
#define cls(s) memset(s,0,sizeof(s))
#define cp pair<LL,int>
#define LL long long int
#define id(x,y) (n * (x - 1) + y)
using namespace std;
const int maxn = 300005,maxm = 10000005;
const LL INF = 1000000000000000ll;
inline int read(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
return out * flag;
}
int h[maxn],ne;
struct EDGE{int to,nxt,w;}ed[maxm];
inline void build(int u,int v,int w){
ed[++ne] = (EDGE){v,h[u],w}; h[u] = ne;
}
int n,N,S,T,vis[maxn];
LL d[maxn];
priority_queue<cp,vector<cp>,greater<cp> > q;
void dijkstra(){
for (int i = 1; i <= N; i++) d[i] = INF; d[S] = 0;
q.push(mp(d[S],S));
int u;
while (!q.empty()){
u = q.top().second; q.pop();
if (vis[u]) continue;
vis[u] = true;
Redge(u) if (!vis[to = ed[k].to] && d[to] > d[u] + ed[k].w){
d[to] = d[u] + ed[k].w;
q.push(mp(d[to],to));
}
}
}
void readin(){
for (int i = 1; i <= n; i++) build(S,id(1,i),read());
for (int i = 1; i < n; i++){
for (int j = 1; j <= n; j++)
build(id(i,j),id(i + 1,j),read());
}
for (int i = 1; i <= n; i++) build(id(n,i),T,read()); for (int i = 1; i <= n; i++){
build(id(i,1),T,read());
for (int j = 1; j < n; j++)
build(id(i,j + 1),id(i,j),read());
build(S,id(i,n),read());
} for (int i = 1; i <= n; i++) build(id(1,i),S,read());
for (int i = 1; i < n; i++){
for (int j = 1; j <= n; j++)
build(id(i + 1,j),id(i,j),read());
}
for (int i = 1; i <= n; i++) build(T,id(n,i),read()); for (int i = 1; i <= n; i++){
build(T,id(i,1),read());
for (int j = 1; j < n; j++)
build(id(i,j),id(i,j + 1),read());
build(id(i,n),S,read());
}
}
int main(){
n = read(); N = n * n + 2; S = N - 1; T = N;
readin();
dijkstra();
printf("%lld\n",d[T]);
return 0;
}

最新文章

  1. js访问php,返回数组时的注意事项
  2. Gollum 安装笔记
  3. python数据库连接池
  4. Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException:
  5. python 使用 setup.py 方式安装及包的卸载
  6. OC6_目录及文件的创建
  7. spark下统计单词频次
  8. Mater Nginx(2) - A Configuration Guide
  9. Linux Epoll介绍和程序实例
  10. LinkButton( 按钮)
  11. oracle 创建表空间详细介绍
  12. 11gRAC CHM 管理
  13. 详解Java反射机制
  14. Jquery-全选和取消的一个坑
  15. 21 PagerTabStrip-PagerTitleStrip-viewPager
  16. 初学angular项目中遇到的一些问题
  17. [Codeforces Round #438][Codeforces 868D. Huge Strings]
  18. linux和Windows下用sublime text3编译运行C,C++
  19. dumpe2fs 命令的使用,转储 ext2/ext3/ext4 文件系统信息
  20. php 设置中文 cookie, js获取

热门文章

  1. FFmpeg+vs2013开发环境配置(windows)
  2. Oz 创建Ubuntu镜像
  3. React Native移动开发实战-3-实现页面间的数据传递
  4. SmartRaiden 和 Lighting Network 进行去中心化跨链原子资产交换
  5. AutoResetEvent 方法名称设计缺陷
  6. C++ 类 构造函数 constructor
  7. [buaa-SE-2017]个人作业-Week2
  8. 调研ANDRIOD平台的开发环境的发展演变
  9. Java第二天——标识符命名规则、Java的知识、快捷键的使用、Scanner获取值的常用方法
  10. MapReduce编程之Semi Join多种应用场景与使用