Krydom: 暁の水平线に胜利を刻むのです

ソロモンの悪夢、見せてあげる!

@krydom11月前

09/24
16:44
最小割

[bzoj 3894] 文理分科

♦♦♦♦♦♦   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

♦♦♦♦♦♦   题解  ♦♦♦♦♦♦

最小割

每个人学文或者学理的满意度很好连边,S连文,T连理

如果某个集合内的人都学理会获得一个满意度,那么就新加一个点,将集合内的所有人向这个点连流量为正无穷的边,再从这个点向T连一条流量为满意度的边,表示集合内任意一个人学文都要把这个点与T的边割掉

然后跑一遍最小割就行了

c++:

pascal:

 

[bzoj 3894] 文理分科