傳送門: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 向所有犯人的出點 因為犯人的點無法割去 連邊,...