NOI2009 植物大戰殭屍

2021-06-03 00:50:39 字數 2292 閱讀 6790

這道題跟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<

NOI 2009 植物大戰殭屍

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

NOI2009 植物大戰殭屍

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

NOI 2009 植物大戰殭屍

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