有n∗m
n*mn∗
m個人,第(i,
j)
(i,j)
(i,j
)選擇文科就可以獲得art
i,
jart_
arti,j
的價值,選擇理科就可以獲得sci
i,
jsci_
scii,j
的價值。如果乙個選擇文科的人周圍都選擇了文科,那麼就可以多獲得sam
e_ar
ti,j
same\_art_
same_a
rti,
j的價值。如果乙個選擇了理科的人周圍都選擇了理科,那麼就可以多獲得sam
e_sc
ii,j
same\_sci_
same_s
cii,
j的價值。
求最大價值和。
顯然不考慮sam
esame
same
的話如何將其模型轉移到網路流上,考慮最小割。我們對於每個同學(i,
j)
(i,j)
(i,j
)建立乙個節點pi,
j,0p_
pi,j,0
,然後s
−>pi
,j,0
s->p_
s−>pi
,j,0
流量為art
i,
jart_
arti,j
,pi,j
,0
−>
tp_->t
pi,j,0
−>
t流量為sci
i,
jsci_
scii,j
。考慮如何加入sam
esame
same
入這個模型中,先考慮文科的,對於乙個點我們發現如果它周圍的都割掉了理科的邊就不需要割sam
e_ar
tsame\_art
same_a
rt,也就是我們需要新建乙個節點連線這些周圍的節點,這樣這些被連線的節點就必須要割掉連向t
tt的邊 。顯然我們還需要建立s
−>pi
,j,1
s->p_
s−>pi
,j,1
流量為sam
e_ar
ti,j
same\_art_
same_a
rti,
js am
e_sc
ii,j
same\_ sci_
same_s
cii,
j同理。
#include
#include
#include
#include
#define p(x,y,z) ((((x)-1)*m+(y))+(z)*s)
using
namespace std;
const
int n=
3e4+
10,inf=
2147483647/3
;struct nodea[n*20]
;const
int dx[5]
=,dy[5]
=;int n,m,s,t,s,tot=1;
int dep[n]
,ls[n]
,ans;
queue<
int> q;
void
adde
(int x,
int y,
int w)
bool
bfs()}
return0;
}int
dinic
(int x,
int flow)if(
!rest)dep[x]=0
;return rest;
}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
(bfs()
) ans-
=dinic
(s,inf)
;printf
("%d"
,ans)
;}
P4313 文理分科 最小割
在說這道題之前,讓我們先思考一下最小割的性質.最小割就是使得s到t不同割掉的最小邊的容量,割過之後,所有的點要麼與s聯通,要麼與t聯通.這樣的性質,即要麼與s有關係,要麼與t有關係的性質 非黑即白 就是典型的最小割的題目.而這道題就顯然,乙個人要麼選文,要麼選理,沒其他的選擇了.所以我們鎖定最小割....
P4313 文理分科
遇到這種利益衝突的最終利益最大化問題 考慮轉化為最小割,使得損失的價值最小 相當於文科是s,理科是t,選出最小割就是確定損失代價最小的方案 然後就把s向每個點連一條cap art i j 的邊,每個點向t連一條cap science i j 的邊,再新建n m個點表示同選文科的利益,然後s向每個新建...
BZOJ 3894 文理分科 最小割
題目大意 給定乙個m n的矩陣,每個格仔的人可以學文或者學理,學文和學理各有乙個滿意度,如果以某人為中心的十字內所有人都學文或者學理還會得到乙個額外滿意度,求最大滿意度之和 令s集為學文,t集為學理 每個人學文或者學理的滿意度很好連邊 如果某個集合內的人都學理會獲得乙個滿意度,那麼就新加乙個點,將集...