51nod 1299 監獄逃離 樹形DP

2021-08-06 04:17:44 字數 1145 閱讀 8602

傳送門:51nod 1299

題意:中

思路:

//dp[i]表示警察全部放置完成後i節點的狀態

//0 表示逃犯不能到達i節點並且i節點能(經由其子樹)到達出口(不經過警察的情況下)

//1 表示逃犯不能到達i節點並且i節點不能(經由其子樹)到達出口(不經過警察的情況下)

//2 表示逃犯能到達i節點並且i節點不能(經由其子樹)到達出口(不經過警察的情況下) 

容易得知葉節點的初始狀態為0,然後我們樹形dp從葉節點開始一點點往上逆推,先隨便選乙個葉子節點當根開始搜尋,注意最後要判斷一下所選的根的狀態,至於狀態轉移,根據狀態之間的關係推一下就好。

關鍵是dp狀態的選取。

**:

#include#include#define ll long long

#define pi acos(-1)

#define maxn 100010

#define inf 0x3f3f3f3f

using namespace std;

typedef pairp;

int ans = 0;

vectormp[maxn];

int ind[maxn], dp[maxn], ban[maxn];

void dfs(int u, int fa)

; for(int i = 0; i < mp[u].size(); i++)

if(ban[u])

else if(cnt[0] && cnt[2])

else if(cnt[0]) dp[u] = 0;

else if(cnt[2]) dp[u] = 2;

else if(cnt[1]) dp[u] = 1;

}int main()

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

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

return 0;

}

51nod1299 監獄逃離(樹形DP)

點此看題面 大致題意 在一棵樹中有n nn條邊連線n 1 n 1n 1個節點,現在已知這棵樹上的m mm個節點,要求封住最少的節點,使這m mm個節點中的任意乙個節點無法到達葉子節點,若能辦到輸出最少封住的節點數,若不能輸出 1 1 1。這道題目的正解是樹形dpdp dp h l666 hl666 ...

51nod 1299 監獄逃離

監獄有n條道路連線n 1個交點,編號0至n,整個監獄被這些道路連在一起 任何2點之間都有道路 人們通過道路在交點之間走來走去。其中的一些交點只有一條路連線,這些點是監獄的出口。在各個交點中有m個點住著犯人 m n 1 剩下的點可以安排警衛,有警衛把守的地方犯人無法通過。給出整個監獄的道路情況,以及犯...

51Nod 1299 監獄逃離

這其實是一道樹形dp的神仙題。然後開始推推推,1 hour later樣例都過不了 然後仔細一看題目,貌似像乙個最小割模型,然後5min想了想建圖 首先拆點,將每個點拆成進和出兩個,然後連邊,邊權即為 1 表示割掉這條邊的代價 然後設超級源 s 讓 s 向所有犯人的出點 因為犯人的點無法割去 連邊,...