luoguP4313 文理分科
luoguP4313 文理分科
复习完之后做了道典型题目。
这道题条件有点多
我们逐个分析
如果没有\(sameart\)或者\(samescience\)的限制,就是一个裸的最大权闭合子图的问题了
但是再考虑有的话(其实还是一个最大权闭合子图)
很明显我们还是可以按照套路分成两个集合.
然后先按照权值分别划分\(S\),\(T\)集合
然后再向他要求的学生连一条\(\infty\)
放一张奇丑无比的图
感性理解一下就好了
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cctype>
#include<algorithm>
#include<queue>
using namespace std;
const int N = 2e5 + 3;
const int M = 2e6 + 3;
const int INF = 2e9;
int cur[N],head[N],high[N];
struct edge{
int to;
int nxt;
int flow;
}e[M];
int n,m,tot = 1,s,t;
int ans = 0;
int dx[5] = {0,1,-1,0,0},dy[5] = {0,0,0,1,-1};
inline void add(int x,int y,int z){
e[++tot].to = y;
e[tot].flow = z;
e[tot].nxt = head[x];
head[x] = tot;
if(z < INF) ans += z;
}
inline int read(){
int v = 0,c = 1;char ch = getchar();
while(!isdigit(ch)){
if(ch == '-') c = -1;
ch = getchar();
}
while(isdigit(ch)){
v = v * 10 + ch - 48;
ch = getchar();
}
return v * c;
}
inline bool bfs(){
queue <int> q;
for(int i = 0;i <= t;++i) high[i] = 0;
q.push(s);high[s] = 1;
while(!q.empty()){
int k = q.front();q.pop();
for(int i = head[k];i;i = e[i].nxt){
int y = e[i].to;
if(!high[y] && e[i].flow > 0)
q.push(y),high[y] = high[k] + 1;
}
}
return high[t] != 0;
}
inline int dfs(int x,int dis){
if(x == t) return dis;
for(int &i = cur[x];i;i = e[i].nxt){
int y = e[i].to;
if(high[y] == high[x] + 1 && e[i].flow > 0){
int flow = dfs(y,min(dis,e[i].flow));
if(flow > 0){
e[i].flow -= flow;
e[i ^ 1].flow += flow;
return flow;
}
}
}
return 0;
}
inline int dinic(){
int res = 0;
while(bfs()){
for(int i = 0;i <= t;++i) cur[i] = head[i];
while(int now = dfs(s,INF)) res += now;
}
return res;
}
int main(){
n = read(),m = read();
s = 3 * n * m + 1,t = s + 1;
for(int i = 0;i < n;++i)
for(int j = 0;j < m;++j){
int x = read();
add(s,i * m + j,x);
add(i * m + j,s,0);
}
for(int i = 0;i < n;++i)
for(int j = 0;j < m;++j){
int x = read();
add(i * m + j,t,x);
add(t,i * m + j,0);
}
for(int i = 0;i < n;++i)
for(int j = 0;j < m;++j){
int x = i * m + j + n * m,y = x + n * m;
for(int k = 0;k < 5;++k){
int xx = i + dx[k],yy = j + dy[k];
if(xx < 0 || xx >= n || yy < 0 || yy >= m) continue;
add(x,xx * m + yy,INF);add(xx * m + yy,x,0);
add(xx * m + yy,y,INF);add(y,xx * m + yy,0);
// add(x,xx * n + yy,0);add(xx * n + yy,x,INF);
// add(xx * n + yy,y,0);add(y,xx * n + yy,INF);
}
}
for(int i = 0;i < n;++i)
for(int j = 0;j < m;++j){
int x = read();
add(s,i * m + j + n * m,x);
add(i * m + j + n * m,s,0);
}
for(int i = 0;i < n;++i)
for(int j = 0;j < m;++j){
int x = read();
add(i * m + j + 2 * n * m,t,x);
add(t,i * m + j + 2 * n * m,0);
}
// cout << ans << endl;
ans -= dinic();
printf("%d\n",ans);
return 0;
}
luoguP4313 文理分科的更多相关文章
- BZOJ3894/LuoguP4313 文理分科 (最小割)
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...
- BZOJ 3894: 文理分科 [最小割]
3894: 文理分科 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 674 Solved: 392[Submit][Status][Discuss] ...
- Bzoj3894 文理分科
Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 667 Solved: 389 Description 文理分科是一件很纠结的事情!(虽然看到这个题 ...
- bzoj 3894: 文理分科
Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行 描述,每个格子代表一个同学的座位. ...
- BZOJ_3894_文理分科&&BZOJ_2127_happiness_最小割
BZOJ_3894_文理分科_最小割 Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进 ...
- BZOJ3894文理分科——最小割
题目描述 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行 描述,每个格子代表一个同学的座位.每位同学必须从 ...
- 【BZOJ3894】文理分科
最小割劲啊 原题: 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行 描述,每个格子代表一个同学的座位.每位 ...
- 文理分科 BZOJ3894 & happiness BZOJ2127
分析: 最小割(一开始我没看出来...后来经过提点,大致理解...),不选则割的思想. 我们先这样考虑,将和选理相关的和S相连,与选文相关的和T相连,如果没有第二问,那么建图就是简单的S连cnt,cn ...
- 【BZOJ3894】文理分科(最小割)
[BZOJ3894]文理分科(最小割) 题面 BZOJ Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班级可以用一个 ...
随机推荐
- 使用Velero Restic快速完成云原生应用迁移至ACK集群
本文记录使用Velero Restic快速完成云原生应用迁移至ACK集群的实践过程. 0. 实践步骤概览 (1)创建GKE集群(或自建Kubernetes集群)(2)在GKE集群上部署示例应用Jenk ...
- json 2016-09-18 22:03 207人阅读 评论(18) 收藏
JSON:JavaScript 对象表示法(JavaScript Object Notation) JSON是什么? JSON(JavaScript Object Notation) 是一种轻量级的数 ...
- LeetCode108 Convert Sorted Array to Binary Search Tree
Given an array where elements are sorted in ascending order, convert it to a height balanced BST. (M ...
- poj 1655 Balancing Act 求树的重心【树形dp】
poj 1655 Balancing Act 题意:求树的重心且编号数最小 一棵树的重心是指一个结点u,去掉它后剩下的子树结点数最少. (图片来源: PatrickZhou 感谢博主) 看上面的图就好 ...
- Android实现圆角边框
http://www.cnblogs.com/flyme/archive/2012/06/20/2556259.html android shape的使用 http://www.cnblogs.com ...
- 修改oracle编码格式
文章参照:https://www.jb51.net/article/53078.htm 1.查看oracle当前编码格式: SELECT * FROM V$NLS_PARAMETERS WHERE P ...
- XML之DOM解析文档 Day24
TestDom.java package com.sxt.dom; import java.io.File; import java.io.IOException; import javax.xml. ...
- pytorch旧版安装
https://pytorch.org/get-started/previous-versions 可以直接下载文件 用 pip 直接在下载目录安装就可以了
- vscode golang vue配置
{ "files.autoSave": "off", "window.title": "${dirty}${activeEdito ...
- H3C路由器Telnet服务配置命令