p2805 NOI2009 植物大戰殭屍

2022-04-30 07:12:08 字數 1722 閱讀 4575

傳送門

分析

我們知道乙個點可以保護他射程的那幾個點和他左邊的那個點

我們又知道如果保護關係成環則環中的點以及這些點左面的點均是無敵的

所以我們按保護關係連邊,然後跑tarjan

然後只要找出點數大於1的聯通塊中的點即可

之後問題就轉換為了求無敵點之外的點所構成圖的最大權閉合子圖

注意此處是正權點連t,負權點連s,因為此處閉合圖是值選乙個點的同時必須選所有能到達它的點

**

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define id(x,y) (x-1)*m+y

const

int inf = 1e9+7

;int n,m,s[80000],is[80000

],ans,s,t;

vector

p[80000

];vector

v[80000

];int dfn[80000],low[80000],ist[80000],cnt,sum,belong[80000],tot[80000

];stack

a;inline

void tarjan(int

x)else

if(ist[v[x][i]])

}if(low[x]==dfn[x])

}}int head[2000100],w[2000100],nxt[2000100],to[2000100],ano[2000100

],res;

int level[80000],cur[2000100

];inline

void add(int x,int y,int

z)inline

bool

bfs()

}return0;

}inline

int dfs(int x,int

flow)

}if(!res)level[x]=-1

;

return

res;

}int

main()

}for(i=1;i<=n;i++)

for(j=1;j<=m;j++)

for(i=1;i<=n*m;i++)

if(!dfn[i])tarjan(i);

for(i=1;i<=n;i++)

for(j=m;j>0;j--)

if(tot[belong[id(i,j)]]!=1

)

break

; }

for(i=1;i<=n;i++)

for(j=1;j<=m;j++)

else

}while(bfs())while(int a=dfs(s,inf))ans-=a;

cout

}

P2805 NOI2009 植物大戰殭屍

給定乙個 n 行 m 列的圖,每個點可以保護一些點。每個點有乙個權值 可以為負數 如果要選取乙個點則必須選取保護它的點以及它右邊的點。試求最大權值和 可以乙個點也不選 1 leq n leq 20,1 leq m leq 30 時限 1 text 空限 125 text sol容易發現這其實是一道最...

P1589 NOI2009 植物大戰殭屍

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

NOI2009 植物大戰殭屍

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