題意:
給定一張$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的最小割 有詳細的講解法和證明 閉合子圖的定義是,圖中每個點所連線的的任何一條邊不指向圖外,可以有邊指向這個圖 這實際上就是乙個依賴關係,如果我們把...