P4313 文理分科 最小割

2021-10-09 21:39:56 字數 2373 閱讀 8732

有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,

j​s 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集為學理 每個人學文或者學理的滿意度很好連邊 如果某個集合內的人都學理會獲得乙個滿意度,那麼就新加乙個點,將集...