[題目鏈結]
[演算法]
首先 , 題目中的約束條件可以概括為"若選a , 則必須選b"
建圖後解最大權閉合子圖即可
注意原圖中在環上的點和能走到環上的點都不能選
時間複雜度 : o(dinic(n , m))
[**]
#includeusingnamespace
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的最小割 有詳細的講解法和證明 閉合子圖的定義是,圖中每個點所連線的的任何一條邊不指向圖外,可以有邊指向這個圖 這實際上就是乙個依賴關係,如果我們把...