NOI2009 植物大戰殭屍

2022-05-09 11:33:16 字數 1449 閱讀 9704

題目描述

題解:由於幹每棵植物之前需要先乾掉它右面的植物和保護他的植物,

我們可以發現這是最大權閉合子圖問題。

簡單提一下。

閉合子圖,指這個子圖中所有的點只會指向子圖中的點。

最大權,指這些點有點權,要求得到的閉合子圖點權之和最大。

解決辦法是,$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的最小割 有詳細的講解法和證明 閉合子圖的定義是,圖中每個點所連線的的任何一條邊不指向圖外,可以有邊指向這個圖 這實際上就是乙個依賴關係,如果我們把...