傳送門
題目描述:
plants vs. zombies(pvz)是最近十分風靡的一款小遊戲。plants(植物)和 zombies(殭屍)是遊戲的主角,其中 plants 防守,而 zombies 進攻。該款遊戲包含多種不同的挑戰系列,比如 protect your brain、bowling 等等。其中最為經典的,莫過於玩家通過控制 plants 來防守 zombies 的進攻,或者相反地由玩家通過控制 zombies 對plants 發起進攻。
現在,我們將要考慮的問題是遊戲中 zombies 對 plants 的進攻,請注意,本題中規則與實際遊戲有所不同。遊戲中有兩種角色,plants 和 zombies,每個 plant 有乙個攻擊位置集合,它可以對這些位置進行保護;而 zombie 進攻植物的方式是走到植物所在的位置上並將其吃掉。
遊戲的地圖可以抽象為乙個 n 行 m 列的矩陣,行從上到下用 0 到 n-1 編號,列從左到右用 0 到 m-1 編號;在地圖的每個位置上都放有乙個 plant,為簡單起見,我們把位於第 r 行第 c 列的植物記為 pr,c 。
plants 分很多種,有攻擊類、防守類和經濟類等等。為了簡單的描述每個 plant,定義 score 和 attack 如下:
score[pr,c]:zombie 擊潰植物 pr,c 可獲得的能源。若 score[pr,c] 為非負整數,則表示擊潰植物 pr,c 可獲得能源 score[pr,c],若為負數表示擊潰 pr,c 需要付出能源 -score[pr,c]。
attack[pr,c]:植物 pr,c 能夠對 zombie 進行攻擊的位置集合。
zombies 必須從地圖的右側進入,且只能沿著水平方向進行移動。zombies 攻擊植物的唯一方式就是走到該植物所在的位置並將植物吃掉。因此 zombies 的進攻總是從地圖的右側開始。也就是說,對於第 r 行的進攻,zombies 必須首先攻擊 pr,m-1 ;若需要對 pr,c(0≤c)攻擊,必須將 pr,m-1,pr,m-2 … pr,c+1 先擊潰,並移動到位置 (r,c) 才可進行攻擊。
在本題的設定中,plants 的攻擊力是無窮大的,一旦 zombie 進入某個 plant 的攻擊位置,該 zombie 會被瞬間消滅,而該 zombie 沒有時間進行任何攻擊操作。因此,即便 zombie 進入了乙個 plant 所在的位置,但該位置屬於其他植物的攻擊位置集合,則 zombie 會被瞬間消滅而所在位置的植物則安然無恙(在我們的設定中,plant 的攻擊位置不包含自身所在位置,否則你就不可能擊潰它了)。
zombies 的目標是對 plants 的陣地發起進攻並獲得最大的能源收入。每一次,你可以選擇乙個可進攻的植物進行攻擊。本題的目標為,制定一套 zombies 的進攻方案,選擇進攻哪些植物以及進攻的順序,從而獲得最大的能源收入。
輸入格式:
輸入第一行包含兩個整數 n,m,分別表示地圖的行數和列數。
接下來 n×m 行描述每個位置上植物的資訊。第 r×m+c+1 行按照如下格式給出植物 pr,c 的資訊:
第乙個整數為 score[pr,c],
第二個整數為集合 attack[pr,c] 中的位置個數 w ,
接下來 w 個位置資訊 (r』,c』),表示 pr,c 可以攻擊位置第 r』 行第 c』 列。
輸出格式:
輸出僅包含乙個整數,表示可以獲得的最大能源收入。注意,你也可以選擇不進行任何攻擊,這樣能源收入為 0 。
樣例資料:輸入
3 210 0
20 0
-10 0
-5 1 0 0
100 1 2 1
100 0 輸出
25 備註:
【樣例說明】
在樣例中, 植物 p1,1 可以攻擊位置 (0,0) , p2,0 可以攻擊位置 (2,1)。
乙個方案為,首先進攻 p1,1, p0,1,此時可以攻擊 p0,0 。共得到能源收益為 (-5)+20+10=25。注意, 位置 (2,1) 被植物 p2,0 保護,所以無法攻擊第 2 行中的任何植物。
【資料範圍】
約 20% 的資料滿足 1≤n,m≤5;
約 40% 的資料滿足 1≤n,m≤10;
約 100% 的資料滿足 1≤n≤20,1≤m≤30,-10000≤score≤10000
賊長的題目描述。。。
對於每個植物,都向保護它的植物連邊,表示要吃掉它,必須先吃掉保護它的植物
那麼要連邊的話有以下兩種情況:
乙個植物能攻擊到的所有位置上的植物要向它連邊
一行中左邊的植物要向右邊的植物連邊
連完邊之後,就是乙個典型的最大權閉合子圖模型,網路流求解即可
注意以下的坑點:
雖然點數不多,最多 600 個,但連出來的邊可能有很多,陣列要開大一點
圖中可能會出現環,即幾種植物互相保護,這時肯定一顆植物都吃不掉,我們用拓撲排序排除掉這種情況即可
#include
using
namespace std;
const
int n=
605,m=
1e6+
5,inf=
0x3f3f3f3f
;int n,m,s,t,t=1;
int d[n]
,f[n]
,in[n]
,score[n]
,first[n]
,v[m]
,w[m]
,nxt[m]
;bool flag[n]
;void
add(
int x,
int y,
int z)
void
topsort()
}queue<
int>q;
bool
bfs()}
return d[t]!=-
1;}int
dinic
(int x,
int flow)
}return ans;
}int
main()
if(j!=m)
add(id,id+
1,inf)
,in[id]++;
}}topsort()
,flag[s]
=flag[t]
=true
;int ans=0;
for(
int i=
1;i<=n*m;
++i)
}while
(bfs()
) ans-
=dinic
(s,inf)
;printf
("%d"
,ans)
;return0;
}
NOI2009 植物大戰殭屍
這道題跟noi2006 最大獲利其實是很像的 一樣都是要搞定一些點才能搞定另一些點,然後有些點正權有些點負權 這種問題,其實是最大權閉合子圖 amber的最小割 有詳細的講解法和證明 閉合子圖的定義是,圖中每個點所連線的的任何一條邊不指向圖外,可以有邊指向這個圖 這實際上就是乙個依賴關係,如果我們把...
NOI 2009 植物大戰殭屍
plants vs.zombies pvz 是最近十分風靡的一款小遊戲。plants 植物 和 zombies 殭屍 是遊戲的主角,其中 plants 防守,而 zombies 進攻。該款遊戲包含多種不同的挑戰系列,比如 protect your brain bowling 等等。其中最為經典的,莫...
NOI2009 植物大戰殭屍
這道題跟noi2006 最大獲利其實是很像的 一樣都是要搞定一些點才能搞定另一些點,然後有些點正權有些點負權 這種問題,其實是最大權閉合子圖 amber的最小割 有詳細的講解法和證明 閉合子圖的定義是,圖中每個點所連線的的任何一條邊不指向圖外,可以有邊指向這個圖 這實際上就是乙個依賴關係,如果我們把...