description
文理分科是一件很糾結的事情!(雖然看到這個題目的人肯定都沒有糾 結過) 小p所在的班級要進行文理分科。他的班級可以用乙個n*m的矩陣進行input描述,每個格仔代表乙個同學的座位。每位同學必須從文科和理科中選擇 一科。同學們在選擇科目的時候會獲得乙個滿意值。滿意值按如下的方式 得到:
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];output接下來n術m個整數,表示same_art[i][j];
輸出為乙個整數,表示最大的滿意值之和sample input
3 4sample output hint13 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
樣例說明題解1表示選擇文科,0表示選擇理科,方案如下:
1 0 0 1
0 1 0 0
1 0 0 0
n,m<=100,讀入資料均<=500
不就是 和 3438乙個套路的題嘛。。st->每個點連邊,流量art
每個點->ed連邊,流量science
組合拆點u,v
st->u 流量art
v->ed 流量science
組合裡面互相連就可以了。。流量inf,不會的看看我3438的blog就可以了。
#include
#include
#include
#include
#include
using namespace std;
struct node
a[3110000];int len,last[1110000];
void ins(int
x,int
y,int c)
int list[1110000],h[81000];
int head,tail,st,ed;
bool bt_h()
}head++;
}if(h[ed]==0)return false;
return true;
}int findflow(int
x,int f)
}if(s==0)h[x]=0;
returns;}
int n,m;
int main()
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++)
while(bt_h())ans+=findflow(st,999999999);
printf("%d\n",sum-ans);
return
0;}
bzoj3894 文理分科 網路流 最小割
題目大意 題目鏈結。注釋 略。想法 這種題也是一種套路。我們新建乙個點表示收益點。然後把所有的收益都加一起,求最小割表示代價即可。code include define inf 0x3f3f3f3f define n 1000100 using namespace std int to n 1 nx...
bzoj3894 文理分科 網路流最小割
題目描述 文理分科是一件很糾結的事情!雖然看到這個題目的人肯定都沒有糾結過 小p所在的班級要進行文理分科。他的班級可以用乙個n m的矩陣進行描述,每個格仔代表乙個同學的座位。每位同學必須從文科和理科中選擇一科。同學們在選擇科目的時候會獲得乙個滿意值。滿意值按如下的方式得到 1 如果第i行第秒j的同學...
BZOJ 3894 文理分科 最小割
題目大意 給定乙個m n的矩陣,每個格仔的人可以學文或者學理,學文和學理各有乙個滿意度,如果以某人為中心的十字內所有人都學文或者學理還會得到乙個額外滿意度,求最大滿意度之和 令s集為學文,t集為學理 每個人學文或者學理的滿意度很好連邊 如果某個集合內的人都學理會獲得乙個滿意度,那麼就新加乙個點,將集...