文理分科是一件很糾結的事情!(雖然看到這個題目的人肯定都沒有糾結過)
小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 413 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
152hint
樣例說明
1表示選擇文科,0表示選擇理科,方案如下:
1 0 0 1
0 1 0 0
1 0 0 0
n,m<=100,讀入資料均<=500
非常經典的最小割問題
要麼選理科,要麼選文科
設計兩個超級點s
ss表示選文科,t
tt表示選理科
與s
ss分在一起的則選的是文科得到art
artar
t,否則是理科得到sci
ence
science
scienc
e 考慮怎麼判斷可額外增加的滿意值
不妨再新添點與s
ss連流量same_art的邊
怎麼保證選了新添點,綁在一起的人都一起選文科呢??
直接與綁在一起的上下左右中點都連流量inf
infin
f,則一定不會出現在最小割裡面
新添點與t
tt連流量same_science的邊
怎麼保證選了新添點,綁在一起的人都一起選理科呢??
同樣的,直接與綁在一起的上下左右中點都連流量inf
infin
f 則一定不會出現在最小割裡面
最後就在這個圖內跑最大流,所有的滿意值減去最小割就是真正的最大滿意值
#
include
#include
#include
using
namespace std;
#define
maxn
200005
#define
inf0x7f7f7f7f
struct
node
edge[maxn <<1]
;queue <
int> q;
int n, m, cnt =
1, num;
int dep[maxn]
, head[maxn]
, cur[maxn]
;int dx[4]
=, dy[4]
=;intid
(int x,
int y )
bool
inside
(int x,
int y )
void
addedge
(int u,
int v,
int w )
intbfs
(int s,
int t )}}
return dep[t];}
intdfs
(int u,
int t,
int cap )
}return flow;
}int
dinic
(int s,
int t )
intmain()
for(
int i =
1;i <= n;i ++
)for
(int j =
1;j <= m;j ++
)for
(int i =
1;i <= n;i ++
)for
(int j =
1;j <= m;j ++
)for
(int i =
1;i <= n;i ++
)for
(int j =
1;j <= m;j ++
)printf
("%d\n"
, ans -
dinic
( s, t ));
return0;
}
D 文理分科 網路流 最小割
題目大意 中文題目 具體思路 我們需要求出最大的滿意值,從另一方面想,我們可以求出總的滿意值,然後再求出不符合情況的最小的代價,這兩個相減,就能求出最大的滿意值,這個時候就可以通過最小割來求了 最小割 使得整個圖不連通的最小花費 這一篇部落格講的很好 ac 1 include2 include3 i...
BZOJ 3894 文理分科 最小割
題目大意 給定乙個m n的矩陣,每個格仔的人可以學文或者學理,學文和學理各有乙個滿意度,如果以某人為中心的十字內所有人都學文或者學理還會得到乙個額外滿意度,求最大滿意度之和 令s集為學文,t集為學理 每個人學文或者學理的滿意度很好連邊 如果某個集合內的人都學理會獲得乙個滿意度,那麼就新加乙個點,將集...
BZOJ 3894 文理分科 最小割
題目大意 給出乙個 每個人要選擇文科或者理科,每個人選擇文科有乙個滿意度,選擇理科有乙個滿意度,以乙個人為中心的五個人全選擇一科也有乙個滿意度。問最大的滿意度是多少。思路 以後看到文理分科之類的8成應該就是最小割了。先把答案全部累加起來,然後減去建圖之後的最大流就是答案。s 每個人 f 這個人選擇文...