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 文理分科的更多相关文章

  1. BZOJ3894/LuoguP4313 文理分科 (最小割)

    #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...

  2. BZOJ 3894: 文理分科 [最小割]

    3894: 文理分科 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 674  Solved: 392[Submit][Status][Discuss] ...

  3. Bzoj3894 文理分科

    Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 667  Solved: 389 Description  文理分科是一件很纠结的事情!(虽然看到这个题 ...

  4. bzoj 3894: 文理分科

    Description  文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过)  小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行 描述,每个格子代表一个同学的座位. ...

  5. BZOJ_3894_文理分科&&BZOJ_2127_happiness_最小割

    BZOJ_3894_文理分科_最小割 Description  文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过)  小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进 ...

  6. BZOJ3894文理分科——最小割

    题目描述  文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过)  小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行 描述,每个格子代表一个同学的座位.每位同学必须从 ...

  7. 【BZOJ3894】文理分科

    最小割劲啊 原题:  文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过)  小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行 描述,每个格子代表一个同学的座位.每位 ...

  8. 文理分科 BZOJ3894 & happiness BZOJ2127

    分析: 最小割(一开始我没看出来...后来经过提点,大致理解...),不选则割的思想. 我们先这样考虑,将和选理相关的和S相连,与选文相关的和T相连,如果没有第二问,那么建图就是简单的S连cnt,cn ...

  9. 【BZOJ3894】文理分科(最小割)

    [BZOJ3894]文理分科(最小割) 题面 BZOJ Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班级可以用一个 ...

随机推荐

  1. python 只导入某个对象

  2. 元素的高度(基于vue)

    const viewH =el.target.offsetHeight;//可见高度 const contentH =el.target.scrollHeight;//内容高度 const scrol ...

  3. 【JZOJ4835】【GDOI2017模拟10.31】量化交易

    题目描述 数据范围 解法 贪心: 从左往右枚举,设枚举到元素为x,并维护一个堆: 设此时堆顶元素为y, 如果x大于y,那么x可以与y产生差价,立即将差价贡献给答案. 如果y之前已经和其他元素z产生过差 ...

  4. VSCode 设置 CPP 代码风格

    VSCode 设置 CPP 代码风格 按 Ctrl+, 打开设置,输入 format 找到. { BasedOnStyle: Google, IndentWidth: 4 }

  5. LeetCode58 Length of Last Word

    题目: Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return t ...

  6. Pytorch使用tensorboardX网络结构可视化。超详细!!!

    https://www.jianshu.com/p/46eb3004beca 1 引言 我们都知道tensorflow框架可以使用tensorboard这一高级的可视化的工具,为了使用tensorbo ...

  7. 当pip安装因为网络超时而无法安装的时候慢

    2.4 尝试pip --default-timeout=1000 install  https://download.pytorch.org/whl/cu100/torch-1.1.0-cp36-cp ...

  8. Java版各种排序算法 (冒泡,快速,选择,插入)

    package com.test4; import java.util.*; //Calendar 显示时间 /** * @author qingfeng * 功能:排序算法 */ public cl ...

  9. Spark JDBC系列--Mysql tinyInt字段特殊处理

    当spark取出表的scheme中,类型名为tinyint的字段,会被处理为Boolean型.而mysql中tinyint的sqlType都会默认处理为bit,所以如果数据库中的这类字段中,存储了0. ...

  10. H3C 802.11无线网络的介质访问控制