time limit: 10 sec memory limit: 512 mb
submit: 674 solved: 392
[submit][status][discuss]
文理分科是一件很糾結的事情!(雖然看到這個題目的人肯定都沒有糾
結過)小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樣例說明
1表示選擇文科,0表示選擇理科,方案如下:
1 0 0 1
0 1 0 0
1 0 0 0
n,m<=100,讀入資料均<=500
乙個人要不選文,要不選理,必須放棄乙個
如果沒有相鄰的神秘加成,直接:
s--文的滿意值-->人--理的滿意值-->t
那麼現在有神秘加成,如何把這個東西割去
對於文科的神秘加成,建乙個點連s容量為全部選文的滿意值,這個點連四周的人容量inf,這樣的話這個滿意值和那些人選理的滿意值必須有乙個被割去
理科同理
點數3nm,邊數2nm+2nm+10nm=14nm
注意
連四周也要連自己啊啊啊啊啊啊啊
#include#include#include
#include
#include
using
namespace
std;
const
int n=3e4+5,m=2e5+5,inf=1e9;
inline
intread()
while(c>='
0'&&c<='9')
return x*f;
}int
n,m,num,s,t,a,b,c;
struct
edgee[m
<<1
];int
cnt,h[n];
inline
void ins(int u,int v,int c)
intq[n],head,tail,vis[n],d[n];
bool
bfs()}}
return
false;}
intcur[n];
int dfs(int u,int
a) }
return
flow;
}int
dinic()
return
flow;
}inline
int id(int i,int j)
intans;
intmain()
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)
printf("%d
",ans-dinic());
}
BZOJ 3894 文理分科 最小割
題目大意 給定乙個m n的矩陣,每個格仔的人可以學文或者學理,學文和學理各有乙個滿意度,如果以某人為中心的十字內所有人都學文或者學理還會得到乙個額外滿意度,求最大滿意度之和 令s集為學文,t集為學理 每個人學文或者學理的滿意度很好連邊 如果某個集合內的人都學理會獲得乙個滿意度,那麼就新加乙個點,將集...
BZOJ 3894 文理分科 最小割
題目大意 給出乙個 每個人要選擇文科或者理科,每個人選擇文科有乙個滿意度,選擇理科有乙個滿意度,以乙個人為中心的五個人全選擇一科也有乙個滿意度。問最大的滿意度是多少。思路 以後看到文理分科之類的8成應該就是最小割了。先把答案全部累加起來,然後減去建圖之後的最大流就是答案。s 每個人 f 這個人選擇文...
bzoj 3894 文理分科 最小割
文理分科是一件很糾結的事情!雖然看到這個題目的人肯定都沒有糾 結過 小p所在的班級要進行文理分科。他的班級可以用乙個n m的矩陣進行 描述,每個格仔代表乙個同學的座位。每位同學必須從文科和理科中選擇 一科。同學們在選擇科目的時候會獲得乙個滿意值。滿意值按如下的方式 得到 1 如果第i行第秒j的同學選...