題目描述
題解:由於幹每棵植物之前需要先乾掉它右面的植物和保護他的植物,
我們可以發現這是最大權閉合子圖問題。
簡單提一下。
閉合子圖,指這個子圖中所有的點只會指向子圖中的點。
最大權,指這些點有點權,要求得到的閉合子圖點權之和最大。
解決辦法是,$s$向正點權的點連容量為點權的邊,負點權的點向$t$連容量為點權相反數的邊。
然後正點權之和-得到的最大流即為最大權。
然而這道題還有種情況,就是自己守自己。
這種情況會構成環,所以拓撲/$tarjan$除環。
**:
#include#include#include
#include
#include
using
namespace
std;
#define n 650
#define ll long long
const
int inf = 0x3f3f3f3f
;const ll inf =0x3f3f3f3f3f3f3f3fll;
inline
intrd()
while(ch>='
0'&&ch<='9')
return f*c;
}int n,m,hed[n],cnt=-1,s=0,t=601
,v[n],ind[n];
vector
ve[n];
int _id(int x,int
y)struct
ege[n*n*10
];void ae(int f,int
t,ll w)
void ae(int f,int
t,ll w)
queue
q;bool
vis[n];
ll sum;
intdep[n],cur[n];
bool
bfs()}}
vis[u] = 0
; }
return dep[t]!=inf;
}ll dfs(
intu,ll lim)
}return
fl;}
ll dinic()
intmain()
if(j!=0
)
}for(int i=m;i<=n*m;i+=m)
if(!ind[i])q.push(i);
while(!q.empty())
}for(int i=1;i<=n*m;i++)}}
memset(vis,
0,sizeof
(vis));
printf(
"%lld\n
",sum-dinic());
return0;
}
NOI2009 植物大戰殭屍
這道題跟noi2006 最大獲利其實是很像的 一樣都是要搞定一些點才能搞定另一些點,然後有些點正權有些點負權 這種問題,其實是最大權閉合子圖 amber的最小割 有詳細的講解法和證明 閉合子圖的定義是,圖中每個點所連線的的任何一條邊不指向圖外,可以有邊指向這個圖 這實際上就是乙個依賴關係,如果我們把...
NOI 2009 植物大戰殭屍
plants vs.zombies pvz 是最近十分風靡的一款小遊戲。plants 植物 和 zombies 殭屍 是遊戲的主角,其中 plants 防守,而 zombies 進攻。該款遊戲包含多種不同的挑戰系列,比如 protect your brain bowling 等等。其中最為經典的,莫...
NOI2009 植物大戰殭屍
這道題跟noi2006 最大獲利其實是很像的 一樣都是要搞定一些點才能搞定另一些點,然後有些點正權有些點負權 這種問題,其實是最大權閉合子圖 amber的最小割 有詳細的講解法和證明 閉合子圖的定義是,圖中每個點所連線的的任何一條邊不指向圖外,可以有邊指向這個圖 這實際上就是乙個依賴關係,如果我們把...