P1589 NOI2009 植物大戰殭屍

2022-05-05 01:36:10 字數 3278 閱讀 6643

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<m-1)攻擊,必須將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 2

10 0

20 0

-10 0

-5 1 0 0

100 1 2 1

100 0

樣例說明:

在樣例中,植物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

noi2009

圖論, 最值子圖, 網路流 ,拓撲排序

3.

植物大戰殭屍

時耗:2h

思路

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 #include

11#define maxx 600*600

12#define ftp 1724036200

13using

namespace

std;

14struct

edde[maxx*4],ee[maxx*4

];17

inthead[maxx],deep[maxx],ans,m,n,tot,w[maxx],du[maxx],head1[maxx];

18bool

vis[maxx];

19int pp(int i,int j)

20void addd(int

from,int to)

21void add(int

from,int to,int c)

22void add(int

from,int to,int c)

23void dfs(int

u)27

void

topsort()

37 }for(int i=1;i<=n*m;++i)

38if(!vis[i])dfs(i);39}

40void

rebuild()49}

50bool bfs(int s,int

t)62

que.pop();

63 }return

false;64

}65int dinic(int s,int t,int

t)72

if(!tag)deep[s]=0;73

return

tag;74}

75int maxflow(int s,int

t)80

intmain()96}

97for(int i=1;i<=n;++i)

98for(int j=m;j>1;j--)

99 addd(pp(i,j),pp(i,j-1

));100 topsort();rebuild();printf("

%d",ans-maxflow(0,n*m+1

));101

return0;

102 }

p2805 NOI2009 植物大戰殭屍

傳送門 分析 我們知道乙個點可以保護他射程的那幾個點和他左邊的那個點 我們又知道如果保護關係成環則環中的點以及這些點左面的點均是無敵的 所以我們按保護關係連邊,然後跑tarjan 然後只要找出點數大於1的聯通塊中的點即可 之後問題就轉換為了求無敵點之外的點所構成圖的最大權閉合子圖 注意此處是正權點連...

P2805 NOI2009 植物大戰殭屍

給定乙個 n 行 m 列的圖,每個點可以保護一些點。每個點有乙個權值 可以為負數 如果要選取乙個點則必須選取保護它的點以及它右邊的點。試求最大權值和 可以乙個點也不選 1 leq n leq 20,1 leq m leq 30 時限 1 text 空限 125 text sol容易發現這其實是一道最...

NOI2009 植物大戰殭屍

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