BZOJ 3894 文理分科 最小割

2021-06-28 20:27:35 字數 1369 閱讀 2619

題目大意:給出乙個**,每個人要選擇文科或者理科,每個人選擇文科有乙個滿意度,選擇理科有乙個滿意度,以乙個人為中心的五個人全選擇一科也有乙個滿意度。問最大的滿意度是多少。

思路:以後看到文理分科之類的8成應該就是最小割了。

先把答案全部累加起來,然後減去建圖之後的最大流就是答案。

s->每個人 f:這個人選擇文科的滿意度

每個人->t f:這個人選擇理科的滿意度

對於每乙個人多建立兩個新點,分別表示以這個點為中心的五個點全部選擇文科和理科。記這兩個點為s1和s2。

s1->以這個點為中心的五個點 f:inf

一這個點為中心的五個點->s2 f:inf

然後就是裸的最小割了。

code:

#define _crt_secure_no_warnings

#include #include #include #include #include #define max 1000010

#define maxp 30010

#define inf 0x3f3f3f3f

#define s 0

#define t (maxp - 1)

using namespace std;

const int dx = ;

const int dy = ;

struct maxflow

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

void insert(int x,int y,int f)

bool bfs()

} return false;

} int dinic(int x,int f)

return f - temp;

}}solver;

int m,n;

int ina[max],outa[max];

int num[110][110],cnt;

int main()

for(int i = 1; i <= m; ++i)

for(int x,j = 1; j <= n; ++j)

for(int i = 1; i <= m; ++i)

for(int x,j = 1; j <= n; ++j)

} for(int i = 1; i <= m; ++i)

for(int x,j = 1; j <= n; ++j)

} int max_flow = 0;

while(solver.bfs())

max_flow += solver.dinic(s,inf);

cout << ans - max_flow << endl;

return 0;

}

BZOJ 3894 文理分科 最小割

題目大意 給定乙個m n的矩陣,每個格仔的人可以學文或者學理,學文和學理各有乙個滿意度,如果以某人為中心的十字內所有人都學文或者學理還會得到乙個額外滿意度,求最大滿意度之和 令s集為學文,t集為學理 每個人學文或者學理的滿意度很好連邊 如果某個集合內的人都學理會獲得乙個滿意度,那麼就新加乙個點,將集...

bzoj 3894 文理分科 最小割

文理分科是一件很糾結的事情!雖然看到這個題目的人肯定都沒有糾 結過 小p所在的班級要進行文理分科。他的班級可以用乙個n m的矩陣進行 描述,每個格仔代表乙個同學的座位。每位同學必須從文科和理科中選擇 一科。同學們在選擇科目的時候會獲得乙個滿意值。滿意值按如下的方式 得到 1 如果第i行第秒j的同學選...

bzoj3894 文理分科 最小割

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