NOI2009 植物大戰殭屍

2022-05-04 23:30:08 字數 2094 閱讀 6163

[題目鏈結]

[演算法]

首先 , 題目中的約束條件可以概括為"若選a , 則必須選b"

建圖後解最大權閉合子圖即可

注意原圖中在環上的點和能走到環上的點都不能選

時間複雜度 : o(dinic(n , m))

[**]

#includeusing

namespace

std;

#define n 2010 typedef

long

long

ll;typedef

long

double

ld;typedef unsigned

long

long

ull;

const

int inf =2e9;

struct

edge

e[n * 2000

];int

n , m , total , tot , s , t , timer , cnt;

inthead[n] , dep[n] , low[n] , dfn[n] , score[n] , belong[n] , sz[n];

intpoint[n][n];

bool

instack[n] , ok[n];

vector

< int >a[n];

stack

< int >s;

template

inline void chkmax(t &x,t y)

template

inline void chkmin(t &x,t y)

template

inline void read(t &x)

inline

void addedge(int u , int v , intw);

head[u] =tot;

++tot;

e[tot] = (edge);

head[v] =tot;

}inline

bool

bfs()}}

return

false;}

inline

int dinic(int u , int

flow)

}return flow -rest;

}inline

void tarjan(int

u)

else

if(instack[v]) chkmin(low[u] , dfn[v]);

}

if (low[u] ==dfn[u])

while (v !=u);

}}inline

void dfs(int

u)int

main()

}s = total + 1 , t = s + 1

;

for (int i = 0; i < n; i++)}}

for (int i = 0; i < n; i++)

}memset(ok ,

true , sizeof

(ok));

for (int i = 1; i <= total; i++)

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

for (int i = 1; i <= total; i++)

if (sz[belong[i]] > 1 &&ok[i]) dfs(i);

int ans = 0

; tot = 1

;

for (int i = 1; i <= total; i++)

else addedge(i , t , -score[i]);

for (unsigned j = 0; j < a[i].size(); j++)

if(ok[a[i][j]]) addedge(a[i][j] , i , inf);

}while

(bfs())

printf(

"%d\n

", ans);

return0;

}

NOI2009 植物大戰殭屍

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

NOI 2009 植物大戰殭屍

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

NOI2009 植物大戰殭屍

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