BZOJ3894/LuoguP4313 文理分科 (最小割)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define R(a,b,c) for(register int  a = (b); a <= (c); ++ a)
#define nR(a,b,c) for(register int  a = (b); a >= (c); -- a)
#define Max(a,b) ((a) > (b) ? (a) : (b))
#define Min(a,b) ((a) < (b) ? (a) : (b))
#define Fill(a,b) memset(a, b, sizeof(a))
#define Swap(a,b) a^=b^=a^=b
#define ll long long
#define ON_DEBUG
#ifdef ON_DEBUG
#define D_e_Line printf("\n\n----------\n\n")
#define D_e(x)  cout << #x << " = " << x << endl
#define Pause() system("pause")
#else
#define D_e_Line ;
#endif
struct ios{
    template<typename ATP>ios& operator >> (ATP &x){
        x = 0; int f = 1; char c;
        for(c = getchar(); c < '0' || c > '9'; c = getchar()) if(c == '-')  f = -1;
        while(c >= '0' && c <= '9') x = x * 10 + (c ^ '0'), c = getchar();
        x*= f;
        return *this;
    }
}io;
using namespace std;
const int N = 30007;
const int M = 300007;
int S, T;
int n, m;
struct Edge{
	int nxt, pre, w;
}e[M];
int head[N], cntEdge = 1; // why 1, why not 0 ? because of S ?
inline void add(int u, int v, int w){
	e[++cntEdge] = (Edge){head[u], v, w}, head[u] = cntEdge;
}
inline void Add(int u, int v, int w){
	add(u, v, w);
	add(v, u, 0);
}
int q[N],h[N];
inline bool BFS(){
    int t = 0, w = 1;
    Fill(h, -1);
    h[S] = 0, q[0] = S;
    while(t != w){
        int u = q[t++];
        for(register int i = head[u]; i; i =e[i].nxt){
            int v = e[i].pre;
            if(e[i].w && h[v] == -1){
                h[v] = h[u] + 1;
                q[w++] = e[i].pre;
            }
        }
    }
    return h[T] != -1;
}
inline int DFS(int u, int f){
    if(u == T) return f;
    int w, used = 0;
    for(register int i = head[u]; i; i = e[i].nxt){
        int v = e[i].pre;
        if(h[v] == h[u] + 1){
            w = DFS(v, Min(f - used, e[i].w));
            e[i].w -= w, e[i^1].w += w;
            used += w;
            if(used == f) return f;
        }
    }
    if(!used) h[u] = -1;
    return used;
}
inline int Dinic(){
    int sum = 0;
    while(BFS()){
        sum += DFS(S, 0x7fffffff);
    }
    return sum;
}
int dx[5] = {-1, 1, 0, 0, 0}, dy[5] = {0, 0, -1, 1, 0}; // (0, 0) is also useful in this problem
inline int id(int x, int y){
	return (x - 1) * m + y;
}
inline void Connect(int x, int y){
	R(i, 0, 4){
		int fx = x + dx[i], fy = y + dy[i];
		if(fx < 1 || fy < 1 || fx > n || fy >m) continue;
		Add(n * m + id(fx, fy), id(x, y), 0x3f3f3f3f);
		Add(id(x, y), n * m * 2 + id(fx, fy), 0x3f3f3f3f);
	}
}
int main(){
	io >> n >> m;
	T = n * m *3 + 1;
	long long sum = 0;
	int val;
	R(i,1,n){
		R(j,1,m){
			io >> val;
			Add(S, id(i, j), val);
			sum += val;
		}
	}
	R(i,1,n){
		R(j,1,m){
			io >> val;
			Add(id(i, j), T, val);
			sum += val;
		}
	}
	R(i,1,n){
		R(j,1,m){
			io >> val;
			Add(S, n * m + id(i, j), val);
			sum += val;
		}
	}
	R(i,1,n){
		R(j,1,m){
			io >> val;
			Add(n * m * 2 + id(i, j), T, val);
			sum += val;
		}
	}
	R(i,1,n){
		R(j,1,m){
			Connect(i, j);
		}
	}
	printf("%lld", sum - Dinic());
	return 0;
}

BZOJ3894/LuoguP4313 文理分科 (最小割)的更多相关文章
- 【BZOJ3894】文理分科 最小割
		
[BZOJ3894]文理分科 Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行描述,每个格 ...
 - BZOJ3894文理分科——最小割
		
题目描述 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行 描述,每个格子代表一个同学的座位.每位同学必须从 ...
 - 【BZOJ3894】【Luogu3358】文理分科 - 最小割多选一模型
		
链接Click Here 这个题就是个板子的最小割多选一模型啦\(QwQ\),这里介绍一种通用的解法. 抛开组合收益不谈,这个题就是一个简单的最小割模型.我们只需要建出来这样一张图,在上面跑最小割,割 ...
 - P4313 文理分科 最小割
		
$ \color{#0066ff}{ 题目描述 }$ 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行描述,每个格 ...
 - BZOJ 3894: 文理分科 [最小割]
		
3894: 文理分科 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 674 Solved: 392[Submit][Status][Discuss] ...
 - BZOJ 3894 Luogu P4313 文理分科 (最小割)
		
题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3894 (luogu) https://www.luogu.org/pro ...
 - [BZOJ3894]文理分科(最小割)
		
(1) 对每个位置建一个点F1,S向这个点连art[i][j]的边,这个点向T连science[i][j]的边. (2) 对每个位置再建一个点F2,S向这个点连same_art[i][j]的边,这个点 ...
 - 【BZOJ3894】文理分科(最小割)
		
[BZOJ3894]文理分科(最小割) 题面 BZOJ Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班级可以用一个 ...
 - 【bzoj3894】文理分科 网路流
		
[bzoj3894]文理分科 2015年3月25日3,4002 Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班 ...
 
随机推荐
- drools中then部分的写法
			
目录 1.背景 2.支持的方法 2.1 insert 插入对象到工作内存中 2.1.1 需求 2.1.2 drl文件编写 2.1.3 部分java代码编写 2.1.4 运行结果 2.1.5 结论 2. ...
 - 负载均衡之DR实验
			
实验环境 本实验搭建在虚拟机中.一台服务器作为DR两台作为RS,还有一台为后续内容会用到的备用机. 实验环境示意图: 1. 修改网络层VIP 修改DR,添加VIP 修改前: 修改后: 修改RS,修改A ...
 - SpringCloudAlibaba分布式流量控制组件Sentinel实战与源码分析(上)
			
概述 定义 Sentinel官网地址 https://sentinelguard.io/zh-cn/index.html 最新版本v1.8.4 Sentinel官网文档地址 https://senti ...
 - LVGL库入门教程01-移植到STM32(触摸屏)
			
LVGL库移植STM32 LVGL库简介 LVGL(Light and Versatile Graphics Library)是一个免费.开源的嵌入式图形库,可以创建丰富.美观的界面,具有许多可以自定 ...
 - 最简单的离散概率分布,伯努利分布 《考研概率论学习之我见》 -by zobol
			
上文讲了离散型随机变量的分布,我们从最简单的离散型分布伯努利分布讲起,伯努利分布很简单,但是在现实生活中使用的很频繁.很多从事体力工作的人,在生活中也是经常自觉地"发现"伯努利分布 ...
 - FICO 常用事务码
			
1.SAP配置流程 1.定义,定义组织,概念,比如FI中定义公司代码,会计科目表,年度变式.SAP中有大量的定义过程. 2.分配,把会计科目表/公司/年度变式等参数分配到公司代码,逻辑组织,基本实现框 ...
 - 基于springBoot项目如何配置多数据源
			
前言 有时,在一个项目中会用到多数据源,现在对自己在项目中多数据源的操作总结如下,有不到之处敬请批评指正! 1.pom.xml的依赖引入 <dependency> <groupId& ...
 - NC200190 矩阵消除游戏
			
NC200190 矩阵消除游戏 题目 题目描述 牛妹在玩一个名为矩阵消除的游戏,矩阵的大小是 \({n}\) 行 \({m}\) 列,第 \({i}\) 行第 \({j}\) 列的单元格的权值为 \( ...
 - BufferedImage类
			
BufferedImage类(BufferedImage,是一个带缓冲区图像类,主要作用是将一副图片加载到内存中) BufferedImage类 是lmage的一个子类,BufferedImage 生 ...
 - Python学习——实现文件交互的学生管理系统
			
第一次用写博客,从前一直在博客园上学习,现在也来这里分享一下我的学习成果. 就开门见山的说吧.首先做了一个流程图,可能也不符合啥规范,就当草稿用,将就着看,明白个设计思路就行. 1.首先系统初始化,定 ...