(題目鏈結)
給出$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等等。其中最為經典的,...