NOI2009 植物大戰殭屍

2022-05-19 02:45:07 字數 1664 閱讀 9814

題意:

給定一張$n\times m$的網格圖,每個點有個植物,價值$score$,能控制點集$s$。

現在有一些殭屍攻擊這些植物,每個殭屍可以任選一行,然後從第$m+1$列一直往左走,消滅遇到的所有植物。

如果乙個殭屍走到某個格仔,它被乙個沒被消滅的植物控制著,則這個殭屍會被消滅。

你可以派出任意個殭屍,求攻擊植物所能獲得的最大價值。

$n,m\leq 30,-10^4 \leq score\leq 10^4$。

題解:互相有控制關係的網路流問題基本就是最大權閉合子圖,於是直接無腦建模就做完了。

注意到如果兩個點位於同乙個強聯通分量,那麼它們永遠沒法產生貢獻。

樸素的做法是用$tarjan$判掉,但其實也可以拓撲排序,最後沒在佇列裡的點直接刪掉即可。

複雜度$o(能過)$。

套路:**:

#include#include

#include

#include

#include

#include

#define maxn 1000005

#define maxm 500005

#define inf 0x7fffffff

#define ll long long

using

namespace

std;

int n,m,a[maxn],hd[maxn],to[maxn<<1

];int t,s,cnt=1,nxt[maxn<<1],fl[maxn<<1

];int

dfn[maxn],low[maxn],dis[maxn],num;

bool

ins[maxn],vis[maxn];

stack

s;inline

intread()

inline

int calc(int x,int y)

inline

void addedge(int u,int v,int

w)inline

bool

spfa()

}return dis[t]!=-1;}

inline

int dfs(int u,int

flow)

} if(sum==0) dis[u]=-1

;

return

sum;

}inline

intdinic()

inline

void tarjan(int

u)

if(low[u]==dfn[u])

}return;}

intmain()

}for(int j=0;j1;j++)

addedge(calc(i,j),calc(i,j+1

),inf);

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

if(!dfn[i]) tarjan(i);

s=0,t=n*m+1; int sum=0

;

for(int i=0;i)

for(int j=0;j)

printf(

"%d\n

",sum-dinic());

return0;

}

植物大戰殭屍

NOI2009 植物大戰殭屍

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

NOI 2009 植物大戰殭屍

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

NOI2009 植物大戰殭屍

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