[Usaco2010 Nov]Visiting Cows
生活随笔
收集整理的這篇文章主要介紹了
[Usaco2010 Nov]Visiting Cows
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
經過了幾周的辛苦工作,貝茜終于迎來了一個假期.作為奶牛群中最會社交的牛,她希望去拜訪N(1<=N<=50000)個朋友.這些朋友被標號為1..N.這些奶牛有一個不同尋常的交通系統,里面有N-1條路,每條路連接了一對編號為C1和C2的奶牛(1 <= C1 <= N; 1 <= C2 <= N; C1<>C2).這樣,在每一對奶牛之間都有一條唯一的通路.
FJ希望貝茜盡快的回到農場.于是,他就指示貝茜,如果對于一條路直接相連的兩個奶牛,貝茜只能拜訪其中的一個.當然,貝茜希望她的假期越長越好,所以她想知道她可以拜訪的奶牛的最大數目.
輸入
第1行:單獨的一個整數N
第2..N行:每一行兩個整數,代表了一條路的C1和C2.
輸出
單獨的一個整數,代表了貝茜可以拜訪的奶牛的最大數目.
樣例輸入
7
6 2
3 4
2 3
1 2
7 6
5 6
樣例輸出
4
分析:
樹上DP。
dp[i][0]表示不選i,以i為根的子樹的最大答案。
dp[i][1]表示選i,以i為根的子樹的最大答案。
狀態轉移方程:dp[i][0]=∑max(dp[j][0],dp[j][1]),dp[i][1]=1+∑f[dp][0]
#include <iostream> #include <string> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <vector> #include <queue> #include <deque> #include <map> #define range(i,a,b) for(int i=a;i<=b;++i) #define LL long long #define rerange(i,a,b) for(int i=a;i>=b;--i) #define fill(arr,tmp) memset(arr,tmp,sizeof(arr)) using namespace std; pair<int,int>e[150005]; int tol,h[50005],dp[50005][2],n; void add_edge(int x,int y){e[++tol].first=y;e[tol].second=h[x];h[x]=tol; } void init() {cin>>n;range(i,1,n-1){int x,y;cin>>x>>y;add_edge(x,y);add_edge(y,x);} } void dfs(int x,int fu){dp[x][1]=1,dp[x][0]=0;for(int i=h[x];i;i=e[i].second){int fir=e[i].first;if(fir==fu)continue;dfs(fir,x);dp[x][1]+=dp[fir][0];dp[x][0]+=max(dp[fir][1],dp[fir][0]);} } void solve(){dfs(1,0);cout<<max(dp[1][0],dp[1][1])<<endl; } int main() {init();solve();return 0; } View Code?
轉載于:https://www.cnblogs.com/Rhythm-/p/9333673.html
總結
以上是生活随笔為你收集整理的[Usaco2010 Nov]Visiting Cows的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 堆和堆排序
- 下一篇: 玖富万卡额度冻结怎么办?冻结原因有这两点