BZOJ 3037 創世紀 樹形DP

2021-06-26 06:08:51 字數 755 閱讀 3483

題目大意:給定一張有向圖,每個點有且僅有一條出邊,要求若乙個點x扔下去,至少存在乙個保留的點y,y的出邊指向x,求最多扔下去多少個點

首先原題的意思就是支配關係 我們反向考慮 求最少保留的點 要求乙個點若扔出去 則必須存在乙個保留的點指向它

於是這就是最小支配集 不過由於是有向圖 所以乙個點要麼選擇 要麼被子節點支配 所以就只剩下2個狀態了

設f[x]為以x為根的子樹選擇x的最小支配集 g[x]為不選擇x的最小支配集

然後由於是基環樹林 所以我們選擇乙個環上的點 拆掉它的出邊 設這個點為x 出邊指向的點為y 討論

1.若x選擇 則y一開始就是被支配狀態 g[y]初值為0 求一遍最小支配集

2.若x不選 正常求最小支配集即可

兩種情況取最小值計入ans 最後輸出n-ans即可

#include#include#include#include#define m 1001001

#define inf 0x3f3f3f3f

using namespace std;

struct abcdtable[m];

int head[m],tot;

int n,p,conquered,ans,a[m],f[m],g[m],fa[m];//f 選 g 被支配

bool v[m];

void add(int x,int y)

void dfs(int x)

void tree_dp(int x)

}int main()

cout<

BZOJ 3037 創世紀 樹形DP

題目大意 給定一張有向圖,每乙個點有且僅有一條出邊,要求若乙個點x扔下去,至少存在乙個保留的點y,y的出邊指向x,求最多扔下去多少個點 首先原題的意思就是支配關係 我們反向考慮 求最少保留的點 要求乙個點若扔出去 則必須存在乙個保留的點指向它 於是這就是最小支配集 只是因為是有向圖 所以乙個點要麼選...

NOIP模擬賽 創世紀

好水的題呀 我們根據它邊連得性質,很容易發現它是乙個基環樹。我們對於樹上,只要使得每個節點至少有乙個點不被選就好了,用樹形dp可以解決,分別求出選這個點與不選這個點時的值。而對於環上的部分,我們就找到兩個相鄰的點,跑一邊環用先前的dp值找出環的最大值,加在一起就行了。include include ...

NOIP2014模擬11 6 創世紀

這題,我們可以轉化成乙個圖論問題,我們只需要記錄入度個數就好了 首先,然後我們把它刪掉之後,就可以看到,它所能控制的點就合法了,因為它可以被乙個不合法的點控制,並把合法的點的出度刪掉。每次就是這樣做。最後一種gg的情況,要特判一下。就是有環的情況 於是,這樣一題看似很難的題就被化成乙個沒有任何演算法...