文理分科 (最小割问题)

Description

文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过)
小P所在的班级要进行文理分科。他的班级可以用一个n*m的矩阵进行描述,每个格子代表一个同学的座位。每位同学必须从文科和理科中选择一科。同学们在选择科目的时候会获得一个满意值。满意值按如下的方式得到:
1.如果第i行第秒J的同学选择了文科,则他将获得art[i][j]的满意值,如果选择理科,将得到science[i][j]的满意值。
2.如果第i行第J列的同学选择了文科,并且他相邻(两个格子相邻当且仅当它们拥有一条相同的边)的同学全部选择了文科,则他会更开心,所以会增加same_art[i][j]的满意值。
3.如果第i行第j列的同学选择了理科,并且他相邻的同学全部选择了理科,则增加same_science[i]j[]的满意值。小P想知道,大家应该如何选择,才能使所有人的满意值之和最大。
请告诉他这个最大值。

Input
第一行为两个正整数:n,m
接下来n术m个整数,表示art[i][j];
接下来n术m个整数.表示science[i][j];
接下来n术m个整数,表示same_art[i][j];

Output
输出为一个整数,表示最大的满意值之和

Sample Input
3 4
13 2 4 13
7 13 8 12
18 17 0 5
8 13 15 4
11 3 8 11
11 18 6 5
1 2 3 4
4 2 3 2
3 1 0 4
3 2 3 2
0 2 2 1
0 2 4 4
Sample Output
152

Hint
样例说明
1表示选择文科,0表示选择理科,方案如下:
1 0 0 1
0 1 0 0
1 0 0 0
N,M<=100,读入数据均<=500

solution

非常经典的最小割问题

要么选理科,要么选文科

设计两个超级点SSS表示选文科,TTT表示选理科

SSS分在一起的则选的是文科得到artartart,否则是理科得到sciencesciencescience

考虑怎么判断可额外增加的满意值

不妨再新添点与SSS连流量same_art的边

怎么保证选了新添点,绑在一起的人都一起选文科呢??

直接与绑在一起的上下左右中点都连流量infinfinf,则一定不会出现在最小割里面

新添点与TTT连流量same_science的边

怎么保证选了新添点,绑在一起的人都一起选理科呢??

同样的,直接与绑在一起的上下左右中点都连流量infinfinf

则一定不会出现在最小割里面

最后就在这个图内跑最大流,所有的满意值减去最小割就是真正的最大满意值

code

#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
#define maxn 200005
#define inf 0x7f7f7f7f
struct node {int nxt, to, flow;
}edge[maxn << 1];
queue < int > q;
int n, m, cnt = 1, num;
int dep[maxn], head[maxn], cur[maxn];
int dx[4] = { 1, -1, 0, 0 }, dy[4] = { 0, 0, 1, -1 };int id( int x, int y ) {return ( x - 1 ) * m + y;
}bool inside( int x, int y ) {if( x < 1 || x > n || y < 1 || y > m ) return 0;else return 1;
}void addEdge( int u, int v, int w ) {cnt ++;edge[cnt].nxt = head[u];edge[cnt].to = v;edge[cnt].flow = w;head[u] = cnt;cnt ++;edge[cnt].nxt = head[v];edge[cnt].to = u;edge[cnt].flow = 0;head[v] = cnt;
}int bfs( int s, int t ) {memcpy( cur, head, sizeof( head ) );memset( dep, 0, sizeof( dep ) );dep[s] = 1;q.push( s );while( ! q.empty() ) {int u = q.front(); q.pop();for( int i = head[u];i;i = edge[i].nxt ) {int v = edge[i].to;if( ! dep[v] && edge[i].flow ) {dep[v] = dep[u] + 1;q.push( v );}}}return dep[t];
}int dfs( int u, int t, int cap ) {if( ! cap || u == t ) return cap;int flow = 0;for( int i = cur[u];i;i = edge[i].nxt ) {cur[u] = i;int v = edge[i].to;if( dep[v] == dep[u] + 1 ) {int w = dfs( v, t, min( cap, edge[i].flow ) );if( ! w ) continue;flow += w;cap -= w;edge[i].flow -= w;edge[i ^ 1].flow += w;if( ! cap ) break;}}return flow;
}int dinic( int s, int t ) {int ans = 0;while( bfs( s, t ) )ans += dfs( s, t, inf );return ans;
}int main() {scanf( "%d %d", &n, &m );int ans = 0, S = 0, T = n * m + 1, w; num = n * m + 1;for( int i = 1;i <= n;i ++ )for( int j = 1;j <= m;j ++ ) {scanf( "%d", &w );addEdge( S, id( i, j ), w );ans += w;}for( int i = 1;i <= n;i ++ )for( int j = 1;j <= m;j ++ ) {scanf( "%d", &w );addEdge( id( i, j ), T, w );ans += w;}for( int i = 1;i <= n;i ++ )for( int j = 1;j <= m;j ++ ) {scanf( "%d", &w );ans += w;num ++;addEdge( S, num, w );addEdge( num, id( i, j ), inf );for( int k = 0;k < 4;k ++ )if( inside( i + dx[k], j + dy[k] ) )addEdge( num, id( i + dx[k], j + dy[k] ), inf );}for( int i = 1;i <= n;i ++ )for( int j = 1;j <= m;j ++ ) {scanf( "%d", &w );ans += w;num ++;addEdge( num, T, w );addEdge( id( i, j ), num, inf );for( int k = 0;k < 4;k ++ )if( inside( i + dx[k], j + dy[k] ) )addEdge( id( i + dx[k], j + dy[k] ), num, inf );}printf( "%d\n", ans - dinic( S, T ) );return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317662.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NOIP2014洛谷P2296:寻找道路(bfs)

解析 杀鸡焉用AS47 做的巨差的一道题 WA3遍写的巨麻烦复杂度被吊打 qwq 说起来很玄学&#xff0c;但第一交之前就有一种强烈的预感觉得自己会WA 一开始像个傻子一样对有环图上记搜 WA了还不知道为啥… 可能真是傻了吧qwq 过了一会看着lojn50,m800干瞪了会眼后终终终于发现了bu…

P7097-[yLOI2020]牵丝戏【dp】

正题 题目链接:https://www.luogu.com.cn/problem/P7097 题目大意 有两个人在打游戏&#xff0c;开始时每个人有个初始伤害xxx和delay值ddd。 有mmm种道具&#xff0c;每个道具一个回合只能用一次&#xff0c;可以使当前回合玩家伤害初始伤害的ki10000\frac{k_i}{10000}1000…

恭贺微软技术俱乐部苏州站正式成立

今天去苏州微软中国&#xff0c;参加了微软技术俱乐部苏州站的成立大会。大会的历程悉数经历&#xff0c;这会儿仍在为各位大佬、社区领袖的奉献精神所感动。在通过我们公司同事分享的链接报名时就了解到&#xff0c;大会上有苏震巍老师和蒋金楠老师的分享&#xff0c;便笃定了…

I. Intersections

I. Intersections 题意&#xff1a; n行&#xff0c;m列&#xff0c;n * m个交点&#xff0c;当我们处于交点&#xff08;i&#xff0c;j&#xff09;&#xff0c; 如果当前时间位于[k * aij k * bij , (k1) * aij k * bij ),我们可以上下移动 如果当前处于[(k1)* aij k *…

[HNOI2013]消毒 (匈牙利最大匹配)

Description 最近在生物实验室工作的小T遇到了大麻烦。 由于实验室最近升级的缘故&#xff0c;他的分格实验皿是一个长方体,其尺寸为abc&#xff0c;a、b、c 均为正整数。为了实验的方便&#xff0c;它被划分为abc个单位立方体区域&#xff0c;每个单位立方体尺寸为111。用(i,…

YbtOJ-变量观测【鸽笼原理】

正题 题目大意 有nnn个数字开始都是000&#xff0c;要求有qqq次操作。 新建一个观测员&#xff0c;观测其中的kkk个数&#xff0c;当这kkk个数从此刻开始变化量不小于ttt时观测结束。将第iii个数加vvv&#xff0c;并输出此时观测结束的观测员编号。 强制在线 1≤n,q≤2105,1…

11.4模拟:总结

解析 110pts 7010300 写三题&#xff0c;挂三题 qwq T1在不同段之间的衔接处犯了个很脑残的错误 T2双向链表l[i]i-1活活写成了l[i]0 结果还能过样例 T3我两个复制的东西改完上面的没改下面的 。。。 qwq 本次做前两题做的有些太快了 样例过了就直接跳了 结果全部挂掉 以后…

.NET Core微服务之路:基于Ocelot的API网关实现--http/https协议篇

前言 最近一直在忙公司和私下的兼职&#xff0c;白天十个小时&#xff0c;晚上四个小时&#xff0c;感觉每天都是打了鸡血似的&#xff0c;精神满满的&#xff0c;连自己那已经学打酱油的娃都很少关心&#xff0c;也有很长一段时间没有更新博客了&#xff0c;特别抱歉&#…

gym 102875A -- Array(未更新完)

gym 102875A – Array 题意&#xff1a; 对于一个数组a&#xff0c;以及数p&#xff0c; q个操作 1.对于区间[l,r]&#xff0c;里面所有数k 2.对于区间[l,r]&#xff0c;里面所有数 * k 3.对于区间[l,r]&#xff0c;里面所有数变成k次幂 4.对于区间[l,r]&#xff0c;输出里面…

[NOI2009] 变换序列 (匈牙利最大匹配)

description … solution 我竟然一眼题&#xff01;&#xff01; 变换后的TTT数组是[0,n)[0,n)[0,n)的排列&#xff0c;变换规则也有&#xff0c;距离DDD也知道 很明显可以求出iii的可能变换对象 这不就是个最大匹配&#xff1f;&#xff1f; 无解就是匹配数量达不到nnn罢了…

YbtOJ-方格填写【插头dp】

正题 题目大意 给出nmn\times mnm的网格填着−1∼4-1\sim 4−1∼4的数字&#xff0c;对于将所有的−1-1−1填上0∼40\sim 40∼4的方案中&#xff0c;定义方案XXX的权值&#xff0c;设在相邻网格之间连线&#xff08;每对只能连一条&#xff09;使得每个网格连出去的边数恰好位…

洛谷P3607:Subsequence Reversal P(区间dp)

解析 很巧妙的题 我一开始的dp设计其实是可以的 只是我误认为它的转移需要n^2 然后尝试把它压掉一维结果越跑越远… 但一个技巧是只从相邻的状态转移 使转移变成O1 代码 #include<bits/stdc.h> using namespace std; #define ll long long const int N52; const int M…

使用 WeihanLi.Npoi 操作 CSV

Intro最近发现 csv 文件在很多情况下都在使用&#xff0c;而且经过大致了解&#xff0c;csv 格式简单&#xff0c;相比 excel 文件要小很多&#xff0c;读取也很是方便&#xff0c;而且也很通用&#xff0c;微软的 ml.net 的示例项目 用来训练模型的数据也是使用的 csv 来保存的…

种类问题

几乎所有种类问题都可以转化成两种模型之一 1.直接维护ans数组 2.统计二维数点问题 前置知识 二维静态数点 以y为第一元素&#xff0c;x为第二元素&#xff0c;原点优先级大于查询点&#xff0c;对所有点&#xff08;原点查询点&#xff09;&#xff0c;然后求 for(int i1;…

「LibreOJ Round #11」Misaka Network 与测试 (网络流跑二分图匹配)

description 研究者们想要测试 Misaka Network&#xff0c;于是他们把 Misaka Network 中的所有妹妹们召集到了一起。 现在妹妹们排成了 N行 M 列&#xff0c;有的位置没有人。现在研究者们给每一个个体的超能力进行了评定&#xff0c;一共有三个能力等级&#xff1a;Level 1 …

YbtOJ-相似子串【SA,RMQ,二分】

正题 题目大意 给出一个长度为nnn的字符串&#xff0c;两个串相似当且仅当可以通过每种字符置换使得它们相同。 qqq次询问这个字符串所有子串中和这个串中sl,rs_{l,r}sl,r​子串有多少个相似的。 1≤n≤105,1≤q≤51051\leq n\leq 10^5,1\leq q\leq 5\times 10^51≤n≤105,1≤…

CF1313D:Happy New Year(状压dp)

解析 比较妙的一道题 首先的一个技巧是把一条线段拆成左和右两个端点 顺便也就有了离散化 利用k的关键限制&#xff0c;压缩每个点覆盖线段的状态 需要动态更新每一位所对应的线段是哪条 代码 #include<bits/stdc.h> using namespace std; #define ll long long cons…

程序员修仙之路--把用户访问记录优化到极致

点击上方蓝色字体&#xff0c;关注我们菜菜呀&#xff0c;前几天做的用户空间&#xff0c;用户反映有时候比较慢呀CEO,CTO,CFO于一身的CXO是吗&#xff1f;菜菜我把你拉进用户反馈群&#xff0c;你解决一下呀CEO,CTO,CFO于一身的CXO&#xff08;完了&#xff0c;以后没清净时候…

Codeforces Round #713 (Div. 3)

Codeforces Round #713 (Div. 3) 题号题目考点ASpy Detected!签到题BAlmost Rectangle模拟题CA-B Palindrome构造DCorrupted Array构造EPermutation by Sum构造FEducation模拟暴力GShort Task筛法求因数和文章目录A题意&#xff1a;题解&#xff1a;代码&#xff1a;B题意&…

[国家集训队]航班安排 (最大费用最大流)

description 神犇航空有K架飞机&#xff0c;为了简化问题&#xff0c;我们认为每架飞机都是相同的。神犇航空的世界中有N个机场&#xff0c;以0…N-1编号&#xff0c;其中0号为基地机场&#xff0c;每天0时刻起飞机才可以从该机场起飞&#xff0c;并不晚于T时刻回到该机场。一…