bzoj1565 NOI2009 植物大戰殭屍

2022-05-21 13:03:14 字數 1223 閱讀 9358

(題目鏈結)

給出$n*m$的棋盤,殭屍攻擊每個格仔可以獲得$v$的分數,每個格仔又會保護一些別的格仔,想攻擊被保護的格仔必須先攻擊沒被保護的格仔。問獲得的最大分數。

建圖,被保護的點向保護它的點連邊。顯然,環上的點是不可能被擊敗的,我們tarjan以後把環上的點以及指向環的點扔掉。剩下的點做最大權閉合子圖就好了。

這裡扔掉不是真的扔掉,只要不讓s和t與之相連就好了。

陣列大小

// bzoj1565

#include#include#include#include#include#include#include#define ll long long

#define inf (1ll<<30)

#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout)

using namespace std;

const int maxn=100010,maxm=1000010;

int head[maxn],d[maxn],n,m,cnt,ans,tot,s,t;

int size[maxn],dfn[maxn],low[maxn],bel[maxn],vis[maxn],val[maxn],st[maxn],dfn,scc,top;

struct edge e[maxm];

paire[maxm];

namespace dinic ;head[u]=cnt;

e[++cnt]=(edge);head[v]=cnt;

} bool bfs()

return d[t]>0;

} int dfs(int x,int f)

if (!used) d[x]=-1;

return used;

} int main()

}void link(int u,int v) ;head[u]=cnt;}

void tarjan(int x)

else if (!bel[e[i].to]) low[x]=min(low[x],dfn[e[i].to]);

} if (dfn[x]==low[x])

}bool dfs(int x)

int main()

ans=max(0,ans-dinic::main());

printf("%d",ans);

return 0;

}

bzoj1565 NOI2009 植物大戰殭屍

傳送門 這道題吃到某個植物a可能需要先吃掉別的植物b 在他的右邊或者保護著他 那麼我們把a連向b。發現這是最大權閉合子圖。顯然是可以通過網路流水過的。閉合子圖 v中頂點的所有出邊均指向v內部頂點 那麼按照最大權閉合圖的建圖方法 1.s向正權點連流量為權值的邊 2.負權點向t連流量為權值的絕對值的邊 ...

BZOJ1565 NOI2009 植物大戰殭屍

好久沒寫部落格了 題目在這裡 沒什麼好說的 應該很容易看出是最大閉合子圖吧?不過要注意一下的是,這題可能有植物是不可能被擊潰的,所以要先跑一遍拓撲排序把這些點排除掉 include include include include include include include include usi...

BZOJ1565 NOI2009 植物大戰殭屍

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