注意乙個事情,殭屍為何要按照一定的順序進攻才能使資源最大化?
即答:一顆植物中可以保護其他的植物。
那麼保護有兩種型別:
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的最小割 有詳細的講解法和證明 閉合子圖的定義是,圖中每個點所連線的的任何一條邊不指向圖外,可以有邊指向這個圖 這實際上就是乙個依賴關係,如果我們把...