日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

旅游(树形dp求树的最大独立集)

發布時間:2023/12/15 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 旅游(树形dp求树的最大独立集) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

鏈接:https://ac.nowcoder.com/acm/problem/15748
來源:牛客網

題目描述
Cwbc和XHRlyb生活在s市,這天他們打算一起出去旅游。
旅行地圖上有n個城市,它們之間通過n-1條道路聯通。
Cwbc和XHRlyb第一天會在s市住宿,并游覽與它距離不超過1的所有城市,之后的每天會選擇一個城市住宿,然后游覽與它距離不超過1的所有城市。
他們不想住在一個已經瀏覽過的城市,又想盡可能多的延長旅行時間。
XHRlyb想知道她與Cwbc最多能度過多少天的時光呢?
聰明的你在仔細閱讀題目后,一定可以順利的解決這個問題!
輸入描述:
第一行,兩個正整數n和s,表示城市個數和第一天住宿的城市s。
接下來n-1行,每行兩個整數x和y,表示城市x與城市y之間有一條雙向道路。
輸出描述:
第一行,一個非負整數表示答案。
示例1
輸入
復制
4 1
1 2
2 3
3 4
輸出
復制
2
說明
第一天,在1號城市住宿,游覽了1、2號城市。
第二天,在3號城市住宿,游覽了4號城市,旅行結束。
備注:
1 ≤ n ≤ 500000, 1 ≤ s, x, y ≤ n。
算是樹的最大獨立集的一個模板題。
樹的最大獨立集,就是這樣的一個集合,這些集合里面的點在樹中互不相鄰。
那么對于樹中的每個節點就有兩種狀態,在最大獨立集里面或者不在最大獨立集里面。
狀態轉移方程:
如果這個點在獨立集里面:dp[u][1]+=dp[to][0] (兒子節點一定不在最大獨立集里面)
如果這個點不在獨立集里面:dp[u][0]+=max(dp[to][1],dp[to][0])(兒子的兩種狀態取最優狀態)。
這個題給定了一開始必須住的那一個城市,所以那一個城市一定在最大獨立集里面。
代碼如下:

#include<bits/stdc++.h> #define ll long long using namespace std;const int maxx=5e5+100; struct edge{int to,next; }e[maxx<<1]; int head[maxx<<1],tot; int dp[maxx][2]; int n,s; /*------------事前準備-----------*/ inline void init() {memset(head,-1,sizeof(head));tot=0; } inline void add(int u,int v) {e[tot].to=v,e[tot].next=head[u],head[u]=tot++; } /*------------樹形dp求樹的最大獨立集-------------*/ inline void dfs(int u,int f) {dp[u][0]=dp[u][1]=0;for(int i=head[u];i!=-1;i=e[i].next){int to=e[i].to;if(to==f) continue;dfs(to,u);dp[u][1]+=dp[to][0];dp[u][0]+=max(dp[to][1],dp[to][0]);}dp[u][1]++;//不要忘了把自己加進去 } int main() {int x,y;while(~scanf("%d%d",&n,&s)){init();for(int i=1;i<n;i++){scanf("%d%d",&x,&y);add(x,y),add(y,x);}dfs(s,0);printf("%d\n",dp[s][1]);//直接輸出這個點在最大獨立集里面的那種狀態下的最優值}return 0; }

努力加油a啊,(o)/~

總結

以上是生活随笔為你收集整理的旅游(树形dp求树的最大独立集)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。