樹形dp P2607 ZJOI2008 騎士

2021-10-10 15:04:05 字數 1008 閱讀 5840

將每個人討厭的人連上一條有向邊,構成了基環樹森林,從每個樹的環上斷一條邊,從兩條邊的點跑兩次dfs,計算一下最大值加到答案裡

還有就是會超int

**

#includeusing namespace std;

const int maxn=2e6+5;

const long long inf=1e17;

int n,root,cnt,v[maxn],fa[maxn],vis[maxn],head[maxn];

long long f[maxn][2];

struct edge

e[maxn];

void add(int x,int y)

long long ans;

void dfs(int x)

dfs(to);

f[x][0]+=max(f[to][0],f[to][1]);

f[x][1]+=f[to][0]; }}

void circle(int x)

dfs(root);

long long ans1=max(f[root][0],f[root][1]);

vis[root]=1;

root=fa[root];

dfs(root);

long long ans2=max(f[root][0],f[root][1]);

ans+=max(ans1,ans2);

}int main()

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

if(!vis[i])

circle(i);

printf("%lld",ans);

return 0;

}

P2607(基環樹 樹形DP)

最近想要刷部落格數,給自己一種努力的假象,最好的方式當然是給做過的題目做一篇題解啦 標準樹形dp題,選了父節點不能選子節點,唯一難點是基環樹的處理 先找環,只需要找到環上的兩個點就行了,其他點不用一起找出,用dfs,斷邊 斷邊的具體操作是 分別將邊上的兩個點設為根進行樹形dp,但兩個點之間還有的關係...

洛谷P2607 騎士 樹形dp

思路 首先我們想到可以對相互憎惡的倆個騎士連邊,這樣就得到了乙個圖,有多個連通塊,並且每個連通塊中最多只有乙個環。如果每個連通塊都是一顆樹,那麼這個問題就很簡單 每個節點都是選或者不選。idea1 我想可不可以把這個比樹多一條邊的圖,變成一棵樹來處理,那麼就是要刪掉環上的一條邊。考慮刪掉這條邊 u,...

樹形DP P1352 沒有上司的舞會

題目裡明確告訴了你上司與下屬的關係是一顆樹,所以這一題是很明顯的樹形dp,而因為下屬和直接上司不能同時參加,所以問題轉換成一棵樹上相鄰的節點不能同時取,求所取點和的最大值。那麼我們可以自上而下地思考,對於乙個節點,自身有取或不取兩種情況,對應這兩種情況的子樹情況也不一樣,可以分類討論 如果這個節點自...