NOI2009 植物大戰殭屍(拓撲排序,網路流)

2021-10-06 21:04:15 字數 1804 閱讀 1300

注意乙個事情,殭屍為何要按照一定的順序進攻才能使資源最大化?

即答:一顆植物中可以保護其他的植物。

那麼保護有兩種型別:

1. 保護

者y位置

在被保護

者x的同

一行,但

是位置比

x前(就

是說想吃

x必須先

吃y)1.保護者y位置在被保護者x的同一行,但是位置比x前(就是說想吃x必須先吃y)

1.保護者y

位置在被

保護者x

的同一行

,但是位

置比x前

(就是說

想吃x必

須先吃y

)2.保護者

y的攻擊

範圍中有

x2.保護者y的攻擊範圍中有x

2.保護者y

的攻擊範

圍中有x

求 最大

能源收入

可以想到

跑答案減

掉最小割

,每乙個

y向x連

邊,s連

資源為負

數的點,

t連資源

為正數的

點。an

s−最大

流即是答

案。(最

大流=最

小割)求最大能源收入可以想到跑答案減掉最小割,每乙個y向x連邊,s連資源為負數的點,t連資源為正數的點。ans-最大流即是答案。(最大流=最小割)

求最大能源收

入可以想

到跑答案

減掉最小

割,每一

個y向x

連邊,s

連資源為

負數的點

,t連資

源為正數

的點。a

ns−最

大流即是

答案。(

最大流=

最小割)

但是這樣的做法有問題:

y 在x

的前面,

x的保護

位置有y

。y在x的前面,x的保護位置有y。

y在x的前面

,x的保

護位置有

y。這樣會形成乙個環。

按理說這種情況殭屍是絕對不可能吃掉這兩顆植物的。(他們兩個互相保護)

但是最大流會跑出這種植物被吃掉的結果。

所以在最大流之前需要拓撲,去掉在環上的點。

存在的點保留它出發的邊。

void

top(

)//拓撲

for(

int i=

1;i<=n*m;i++)}

while

(!q.

empty()

)}}}

void

build()

//重新建圖

else

for(

int i=

0;i.size()

;i++)}

}}intmain()

}}for(

int i=

1;i<=n;i++)}

//主要的3個函式

top();

build()

;dinic()

;printf

("%d\n"

,ans-maxnf)

;//減去最小割

return0;

}

NOI2009 植物大戰殭屍

這道題跟noi2006 最大獲利其實是很像的 一樣都是要搞定一些點才能搞定另一些點,然後有些點正權有些點負權 這種問題,其實是最大權閉合子圖 amber的最小割 有詳細的講解法和證明 閉合子圖的定義是,圖中每個點所連線的的任何一條邊不指向圖外,可以有邊指向這個圖 這實際上就是乙個依賴關係,如果我們把...

NOI 2009 植物大戰殭屍

plants vs.zombies pvz 是最近十分風靡的一款小遊戲。plants 植物 和 zombies 殭屍 是遊戲的主角,其中 plants 防守,而 zombies 進攻。該款遊戲包含多種不同的挑戰系列,比如 protect your brain bowling 等等。其中最為經典的,莫...

NOI2009 植物大戰殭屍

這道題跟noi2006 最大獲利其實是很像的 一樣都是要搞定一些點才能搞定另一些點,然後有些點正權有些點負權 這種問題,其實是最大權閉合子圖 amber的最小割 有詳細的講解法和證明 閉合子圖的定義是,圖中每個點所連線的的任何一條邊不指向圖外,可以有邊指向這個圖 這實際上就是乙個依賴關係,如果我們把...