日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

17AHU排位赛2 E题(树上最大匹配,树形DP)

發(fā)布時(shí)間:2023/12/20 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 17AHU排位赛2 E题(树上最大匹配,树形DP) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

problem

有一個(gè)n個(gè)節(jié)點(diǎn)n-1條邊組成的樹(shù)。
每個(gè)點(diǎn)看成一個(gè)人,連接u和v的邊看成是“中意關(guān)系”,即u和v兩個(gè)人都想和對(duì)方組隊(duì)。每個(gè)人希望組隊(duì)的對(duì)象有可能有多個(gè)。
一支隊(duì)伍由且僅由兩個(gè)人組成,并且如果u和v組隊(duì)了,那么u、v將不能和其他人再組成一支隊(duì)。
現(xiàn)在問(wèn)你,這n個(gè)人最多能組成多少支隊(duì)伍。(允許某些人組不了隊(duì))

Input

第一行輸入一個(gè)整數(shù)n,m(1<=n<=200000)
接下來(lái)n-1行,每行兩個(gè)整數(shù)u,v,表示u和v兩個(gè)人都想和對(duì)方組隊(duì)。
數(shù)據(jù)保證是一個(gè)合法的樹(shù)。

Output

輸出一個(gè)整數(shù),表示最多能組成多少支隊(duì)伍。

Input

5
1 2
1 3
2 4
4 5

Output

2

Limitation

1s 256MB

Hint

一種可行的組隊(duì)方案:
1與3組隊(duì)
4與5組隊(duì)
最多組成2支隊(duì)


思路

基本的樹(shù)形DP
dp[rt][0]表示rt這個(gè)點(diǎn)不與任何一個(gè)兒子連邊,以k為根的子樹(shù)的最大匹配
dp[rt][1]表示rt這個(gè)點(diǎn)與某一個(gè)兒子連邊,以k為根的子樹(shù)的最大匹配


核心代碼

void dfs(int rt,int f) {int mi=n;if(G[rt].size()==1&&G[rt][0]==f){return ;}for(int i=0;i<G[rt].size();++i){int tt=G[rt][i];if(tt==f) continue;dfs(tt,rt);dp[rt][0]+=dp[tt][1];dp[rt][1]+=dp[tt][1];if(dp[tt][1]-dp[tt][0]<mi) mi=dp[tt][1]-dp[tt][0];}dp[rt][1]=dp[rt][1]-mi+1; }


代碼示例

#include<bits/stdc++.h> using namespace std; const int maxn=200010;int n;vector<int> G[maxn];int dp[maxn][2];void dfs(int rt,int f) {int mi=n;if(G[rt].size()==1&&G[rt][0]==f){return ;}for(int i=0;i<G[rt].size();++i){int tt=G[rt][i];if(tt==f) continue;dfs(tt,rt);dp[rt][0]+=dp[tt][1];dp[rt][1]+=dp[tt][1];if(dp[tt][1]-dp[tt][0]<mi) mi=dp[tt][1]-dp[tt][0];}dp[rt][1]=dp[rt][1]-mi+1; }int main() {ios::sync_with_stdio(false);cin>>n;int u,v;for(int i=1;i<n;++i){cin>>u>>v;G[u].push_back(v);G[v].push_back(u);}dfs(1,0);cout<<max(dp[1][0],dp[1][1])<<endl;return 0; }

總結(jié)

以上是生活随笔為你收集整理的17AHU排位赛2 E题(树上最大匹配,树形DP)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。