传送门


首先一个不知道怎么证的结论:任意点的\(H\)只会是\(0\)或\(1\)

那么可以发现原题的本质就是一个最小割,左上角为\(S\),右下角为\(T\),被割开的两个部分就是\(H=0\)与\(H=1\)的部分

直接上Dinic似乎有90pts

然后可以发现原图是一个经典的平面图

于是将平面图最小割转化成对偶图最短路模型,然后堆优化Dijkstra即可。

关于平面图最小割转化为对偶图最短路可以看这个

#include<bits/stdc++.h>
#define id(i , j) (((i) - 1) * N + (j))
#define INF 0x3f3f3f3f
#define st first
#define nd second
#define PII pair < int , int >
//This code is written by Itst
using namespace std; inline int read(){
int a = 0;
char c = getchar();
bool f = 0;
while(!isdigit(c) && c != EOF){
if(c == '-')
f = 1;
c = getchar();
}
if(c == EOF)
exit(0);
while(isdigit(c)){
a = (a << 3) + (a << 1) + (c ^ '0');
c = getchar();
}
return f ? -a : a;
} const int MAXN = 255010 , MAXM = 2050010;
struct Edge{
int end , upEd , w;
}Ed[MAXM];
int head[MAXN] , dis[MAXN];
int N , S , T , cntEd = 1;
priority_queue < PII > q; inline void addEd(int a , int b , int c){
Ed[++cntEd].end = b;
Ed[cntEd].upEd = head[a];
Ed[cntEd].w = c;
head[a] = cntEd;
} inline void Dijk(){
memset(dis , 0x3f , sizeof(dis));
dis[S] = 0;
q.push(PII(0 , S));
while(!q.empty()){
PII t = q.top();
q.pop();
if(-t.st > dis[t.nd])
continue;
if(t.nd == T)
return;
for(int i = head[t.nd] ; i ; i = Ed[i].upEd)
if(dis[Ed[i].end] > dis[t.nd] + Ed[i].w){
dis[Ed[i].end] = dis[t.nd] + Ed[i].w;
q.push(PII(-dis[Ed[i].end] , Ed[i].end));
}
}
} void input(){
N = read();
T = id(N , N) + 1;
for(int i = 0 ; i <= N ; ++i)
for(int j = 1 ; j <= N ; ++j){
int k = read();
if(i == 0)
addEd(S , id(i + 1 , j) , k);
else
if(i == N)
addEd(id(i , j) , T , k);
else
addEd(id(i , j) , id(i + 1 , j) , k);
}
for(int i = 1 ; i <= N ; ++i)
for(int j = 0 ; j <= N ; ++j){
int k = read();
if(j == 0)
addEd(id(i , j + 1) , T , k);
else
if(j == N)
addEd(S , id(i , j) , k);
else
addEd(id(i , j + 1) , id(i , j) , k);
}
for(int i = 0 ; i <= N ; ++i)
for(int j = 1 ; j <= N ; ++j){
int k = read();
if(i && i != N)
addEd(id(i + 1 , j) , id(i , j) , k);
}
for(int i = 1 ; i <= N ; ++i)
for(int j = 0 ; j <= N ; ++j){
int k = read();
if(j && j != N)
addEd(id(i , j) , id(i , j + 1) , k);
}
} void work(){
Dijk();
cout << dis[T];
} int main(){
#ifndef ONLINE_JUDGE
freopen("in" , "r" , stdin);
//freopen("out" , "w" , stdout);
#endif
input();
work();
return 0;
}

最新文章

  1. Attribute操作的性能优化方式
  2. Intent属性详解一 component属性
  3. 新版Microsoft Azure Web管理控制台 - Microsoft Azure New Portal - (1)
  4. js函数的调用问题
  5. 2015 Multi-University Training Contest 1 - 1002 Assignment
  6. iOS 开发 - 改善APP的流畅度 (绘制股票行情)
  7. 运行Appium碰到的坑们
  8. Windows 和 Linux 的IPC API对应表
  9. java对Ldap操作2
  10. 收藏maven错误
  11. Int16 Int32 Int64
  12. 使用visualvm 远程监控 JVM
  13. linux服务器没网情况下手动安装软件几个方法
  14. centos 7 下面安装oracle 11g r2 过程分享
  15. scrapy_移除内容中html标签
  16. jquery父元素和子元素点击事件传递问题_不可把父元素的事件传递给子元素_事件无限循环传递
  17. 反射中Class.forName()和classLoader的区别
  18. WIN 7 使用shutdown命令设置电脑自动关机
  19. Mysql 索引问题-日期索引使用
  20. U3D 贴图通道分离后为什么能减小体积

热门文章

  1. (后端)NoSuchMethodError
  2. 使用wxpy来实现自动发送消息统计微信好友信息的功能
  3. 洗礼灵魂,修炼python(34)--面向对象编程(4)—继承
  4. python第三十天-类
  5. python第七天-作业[购物车]
  6. Django之model模块创建表完整过程
  7. WebAPi使用Autofac实现依赖注入
  8. SpringBoot整合Rabbitmq设置消息请求头
  9. Java中常用的字节流和字符流
  10. VMware虚拟机中CentOS 7的硬盘空间扩容