Advertisement
jeff69

Untitled

Sep 27th, 2016
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.30 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. typedef long double ld;
  5.  
  6. int n;
  7. const int MXN=1e5+3;
  8. vector<int> adj[MXN];
  9. int dp[MXN][2][2];
  10. int dfs (int x,int pa,bool f,bool s)
  11. {
  12.     if(dp[x][f][s]!=-1)return dp[x][f][s];
  13.     int ans=0;
  14.     bool pp=0;
  15.     if((int)adj[x].size()>=3+f)
  16.         pp=1;
  17.     int ret=0;
  18.     if(s)
  19.     {
  20.         for(auto u :adj[x])
  21.         {
  22.             if(u==pa)continue;
  23.             ans+=dfs(u,x,1,0);
  24.         }
  25.         return dp[x][f][s]=ans;
  26.     }
  27.         //1 take it
  28.  
  29.     for(auto u :adj[x])
  30.     {
  31.         if(u==pa)continue;
  32.         ans+=dfs(u,x,0,1);
  33.     }
  34.     ret=ans+pp;
  35.     ans=0;
  36.     for(auto u :adj[x])
  37.     {
  38.         if(u==pa)continue;
  39.         if(pp)ans+=dfs(u,x,1,0);
  40.        else ans+=dfs(u,x,0,0);
  41.     }
  42.     ret=max(ret,ans);
  43.  
  44.     return dp[x][f][s]=ret;
  45. }
  46. int main()
  47. {
  48.     int t;
  49.     cin>>t;
  50.     while(t--)
  51.     {
  52.     scanf("%d",&n);
  53.     for(int i=1; i<n; i++)
  54.     {
  55.         int x,y;
  56.         scanf("%d%d",&x,&y);
  57.         adj[x].push_back(y);
  58.         adj[y].push_back(x);
  59.     }
  60.     memset(dp,-1,sizeof dp);
  61.    int ans=dfs(1,0,0,0);
  62.    ans=max(ans,dfs(1,0,0,1));
  63.        memset(dp,-1,sizeof dp);
  64. ans=max(ans,dfs(n,0,0,0));
  65. cout<<ans<<endl;
  66.     for(int i=1;i<MXN;i++)adj[i].clear();
  67.     }
  68.     return 0;
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement