bzoj3894 文理分科 網路流最小割

2022-05-20 17:55:23 字數 1557 閱讀 5003

題目描述

文理分科是一件很糾結的事情!(雖然看到這個題目的人肯定都沒有糾結過)

小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想知道,大家應該如何選擇,才能使所有人的滿意值之和最大。請告訴他這個最大值。

輸入第一行為兩個正整數:n,m

接下來n術m個整數,表示art[i][j];

接下來n術m個整數.表示science[i][j];

接下來n術m個整數,表示same_art[i][j];

輸出輸出為乙個整數,表示最大的滿意值之和

樣例輸入

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

樣例輸出

152題解

網路流最小割,和 bzoj3438 差不多。

具體做法:

1.s向每個學生連邊,容量為理科收益;每個學生向t連邊,容量為文科收益。

2.將每個學生組合拆成兩個,s與第乙個連邊,容量為全理科收益,第乙個向組合中學生連邊,容量為inf;

組合中學生向第二個連邊,容量為inf,第二個向t連邊,容量為全文科收益。

3.跑最小割,答案為總收益-mincut。

#include #include #include #define inf 0x3fffffff

using namespace std;

queueq;

int head[40000] , to[300000] , val[300000] , next[300000] , cnt = 1 , s , t , dis[40000];

void add(int x , int y , int z)

bool bfs()

} }return 0;

}int dinic(int x , int low)

} return low - temp;

}int main()

for(i = 1 ; i <= n * m ; i ++ )

while(bfs()) ans -= dinic(s , inf);

printf("%d\n" , ans);

return 0;

}

BZOJ 3894 文理分科

time limit 10 sec memory limit 512 mb submit 194 solved 122 submit status discuss description 文理分科是一件很糾結的事情!雖然看到這個題目的人肯定都沒有糾 結過 小p所在的班級要進行文理分科。他的班級可以用...

BZOJ 3894 文理分科

解四個方程。為了簡潔我們畫出來兩個來解方程推理一下。s a aa s b ab a t ba b t bb s x a和其他相關格仔收益 x t 同上 include include include include include define maxn 1000010 using namespac...

bzoj3894 文理分科

s向每個人連邊,容量是選文科的滿意值 每個點向t連邊,容量是選理科的滿意值。再新建2 n m個點,表示每個人和相鄰的人都選文 p1 或都選理 p2 s向p1連邊,容量為這個人的same art,p1再向這個人和相鄰的四個人都連inf的邊 p2向t連邊,容量為這個人的same science,這個人以...