NOI2009 植物大戰殭屍

2021-08-26 13:50:24 字數 2010 閱讀 5616

這道題跟noi2006 最大獲利其實是很像的

一樣都是要搞定一些點才能搞定另一些點,然後有些點正權有些點負權

這種問題,其實是最大權閉合子圖

amber的最小割**有詳細的講解法和證明

閉合子圖的定義是,圖中每個點所連線的的任何一條邊不指向圖外,可以有邊指向這個圖

這實際上就是乙個依賴關係,如果我們把a依賴b(在這道題就是b保護a),在圖中用一條a指向b的邊表示

那麼我們求的就是乙個閉合子圖,就是說不可能出現圖中選了a而沒有選b的情況,因為這樣不滿足閉合子圖的定義

而最大權閉合子圖則可以用網路流來解決

對於原圖,我們把每條邊的流量設為∞

然後對於每個正權點,從st向點連一條邊,邊權為點的權值

對於每個負權點,從點向ed連一條邊,邊權為點的權值的絕對值

那麼最大權閉合子圖的答案就是所有正權-網路流的最小割

因為是最小割,顯然我們不會割到原圖的流量為∞的邊,這樣就滿足了閉合子圖的定義——並沒有破壞依賴關係

然後我們如果割了連線st的邊,相當於捨棄掉這個正權點,割了連線ed的邊,相當於選擇了這個負權點

最後所有正權點的權值和(可能達到的最大值)-最小割(付出的代價),就是最大權閉合子圖的答案

對於這道題和noi2006最大獲利,一樣的建圖即可

但是這道題有一點比最大獲利要麻煩,就是這道題可以出現環

如果出現了環,求最大權閉合子圖的時候則視情況將這個環裡的點一併取走或不取

但這道題則要求無論如何都不能取

因此要先toposort一遍去環再建圖才行……

這道題我用了遞迴版的isap(主要是可以少寫乙個bfs),結果暴慢……雖然也能ac……

gzh神犇寫了個非遞迴的isap,比我的dinic快……

好吧以後再也不寫遞迴isap了……老老實實寫dinic……

//lib #include#include#include#include#include#include#include#include#include#include#includeusing namespace std; //macro #define rep(i,a,b) for(int i=a,tt=b;i<=tt;++i) #define drep(i,a,b) for(int i=a,tt=b;i>=tt;--i) #define erep(i,e,x) for(int i=x;i;i=e[i].next) #define irep(i,x) for(__typedef(x.begin()) i=x.begin();i!=x.end();i++) #define read() (strtol(ipos,&ipos,10)) #define sqr(x) ((x)*(x)) #define pb push_back #define ps system("pause"); typedef long long ll; typedef pairpii; const int oo=~0u>>1; const double inf=1e100; const double eps=1e-6; string name="pvz", in=".in", out=".out"; //var struct e e[1000008],e2[1000008]; queueq; int n,m,st,ed,tot=1; int cnt[1008],dis[1008],h[1008],h2[1008],node[28][38],map[28][38],ind[1008],ans,size; bool vis[1008]; void add(int a,int b,int c) void add2(int a,int b) void toposort() } } void build() } void init() if(j!=m)add2(node[i][j+1],node[i][j]); } } toposort(); build(); } bool bfs() } } return flag; } int dfs(int u,int low) if(ret==low)dis[u]=-1; return ret-low; } void work() { int flow; while(bfs()) while(flow=dfs(st,oo)) ans-=flow; cout<

NOI2009 植物大戰殭屍

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

NOI 2009 植物大戰殭屍

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

NOI 2009 植物大戰殭屍

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