最大權閉合子圖。一般來說建圖方法都是——正權值連s,負權值連t,如果乙個節點被選擇,其子節點也必須被選擇,連一條inf的有向邊。求最小割即可,答案就是正權點權值和-最大流——中間的邊一定不可能被割掉左邊割掉,左邊割掉表示不選擇,右邊割掉表示選擇。
但是有可能出現環的情況,這樣子不能直接割。我們考慮先來乙個tarjan縮點,給每個點的權值都賦成-inf。
**如下:
#include#include#include#include#include#include#define s 0
#define t n*m+1
#define maxn 400010
#define inf 0x3f3f3f3f
#define check
using namespace std;
int n,m,cnt1=1,cnt2,cnt,top,ans,tim;
int head1[maxn],head2[maxn],sum[maxn],dep[maxn],cur[maxn];
int in[maxn],dfn[maxn],low[maxn],ins[maxn],st[maxn];
struct edgeedge[maxn],pre[maxn];
inline int id(int x,int y)
inline void add1(int from,int to,int dis,int p)
inline void add2(int from,int to)
inline void tarjan(int x)
if(dfn[x]==low[x])
while(x!=v);}}
}inline bool bfs()
}if(dep[t]==0x3f3f3f3f) return false;
return true;
}inline int dfs(int x,int f)
}return used;
}inline int dinic()
int main()
else
for(int k=head2[id(i,j)];k;k=pre[k].nxt)}}
printf("%d\n",ans-dinic());
return 0;
}
NOI2009 植物大戰殭屍
這道題跟noi2006 最大獲利其實是很像的 一樣都是要搞定一些點才能搞定另一些點,然後有些點正權有些點負權 這種問題,其實是最大權閉合子圖 amber的最小割 有詳細的講解法和證明 閉合子圖的定義是,圖中每個點所連線的的任何一條邊不指向圖外,可以有邊指向這個圖 這實際上就是乙個依賴關係,如果我們把...
NOI 2009 植物大戰殭屍
plants vs.zombies pvz 是最近十分風靡的一款小遊戲。plants 植物 和 zombies 殭屍 是遊戲的主角,其中 plants 防守,而 zombies 進攻。該款遊戲包含多種不同的挑戰系列,比如 protect your brain bowling 等等。其中最為經典的,莫...
NOI2009 植物大戰殭屍
這道題跟noi2006 最大獲利其實是很像的 一樣都是要搞定一些點才能搞定另一些點,然後有些點正權有些點負權 這種問題,其實是最大權閉合子圖 amber的最小割 有詳細的講解法和證明 閉合子圖的定義是,圖中每個點所連線的的任何一條邊不指向圖外,可以有邊指向這個圖 這實際上就是乙個依賴關係,如果我們把...