Advertisement
jeff69

Untitled

Sep 29th, 2016
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.55 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. typedef long double ld;
  5. int n;
  6. const int MX=1e5+4;
  7. vector<int> adj[MX];
  8. int dp[MX][3][2];
  9. int memo[MX][4][2];
  10. int memory[MX][2];
  11. int dfs(int x,int pa,bool f,int d);
  12. int nig(int x,int pa,int t,int y,bool f)
  13. {
  14.     if(y==(int)adj[x].size())
  15.     {
  16.         if(t==0)return 0;
  17.         return -1e5-4;
  18.  
  19.     }
  20.     if(memo[y][t][f]!=-1)return memo[y][t][f];
  21.     int ans=0;
  22.     int ch=adj[x][y];
  23.     if(ch==pa)return memo[y][t][f]=max(nig(x,pa,t,y+1,f),nig(x,pa,t-!f,y+1,f));
  24.     if(t)
  25.     ans=nig(x,pa,t-1,y+1,f)+dfs(ch,x,0,2);
  26.     ans=max(ans,nig(x,pa,t,y+1,f)+dfs(ch,x,0,1));
  27.     //if(x==2)cout<<ans<<' ';
  28.     return memo[y][t][f]=ans;
  29. }
  30. int dfs(int x,int pa,bool f,int d)
  31. {
  32.  
  33.     int ans=0;
  34.     int ret=0;
  35.     bool star=0;
  36.     if(dp[x][d][f]!=-1)return dp[x][d][f];
  37.     if(d)
  38.     {
  39.         for(auto u:adj[x])
  40.         {
  41.             if(u==pa)continue;
  42.             ans+=dfs(u,x,1,d-1);
  43.         }
  44.         return dp[x][d][f]=ans;
  45.     }
  46.     if(adj[x].size()>=3+f)star =1;
  47.     ans=0;
  48.     for(auto u : adj[x])
  49.     {
  50.         if(u==pa)continue;
  51.         ans+=dfs(u,x,1,0);
  52.     }
  53.     ret=max(ret,ans);
  54.     if(!star){
  55.            ans=0;
  56.          //  cout<<x<<'#'<<endl;
  57.          for(auto u : adj[x])
  58.     {
  59.         if(u==pa)continue;
  60.         ans+=dfs(u,x,0,0);
  61.     }
  62.     return dp[x][d][f]=max(ans,ret);
  63.  
  64.  
  65.     }
  66.  
  67.  
  68.     //take a star and delete all sons but 3 sons
  69.     if(memory[x][f]!=-1){ret=max(ret,memory[x][f]);return dp[x][d][f]=ret;}
  70.  
  71.     for(int i=0;i<=adj[x].size();i++)
  72.         for(int k=0;k<4;k++)
  73.         for(int j=0;j<2;j++)
  74.         memo[i][k][j]=-1;
  75.     ans=1;
  76.     ans+=nig(x,pa,3,0,f);
  77.     //if(f==0)if(x==2)cout<<"Y";
  78.     //cout<<x<<' '<<f<<' '<<ans<<endl;
  79.     memory[x][f]=ans;
  80.     ret=max(ret,ans);
  81.    // if(x==1)cout<<ret<<endl;
  82.     ans=0;
  83.     for(auto u : adj[x])
  84.     {
  85.         if(u==pa)continue;
  86.         ans+=dfs(u,x,1,1);
  87.     }
  88.     int rr=ans;
  89.     for(auto u : adj[x])
  90.     {
  91.         if(u==pa)continue;
  92.         rr =max(rr,ans-dfs(u,x,1,1)+dfs(u,x,0,0));
  93.     }
  94.     ret=max(rr,ret);
  95.     return dp[x][d][f]=ret;
  96.  
  97. }
  98. void sset()
  99. {
  100.         memset(dp,-1,sizeof dp);
  101.         memset(memory,-1,sizeof memory);
  102.         for(int i=0;i<=n;i++)adj[i].clear();
  103. }
  104. int main()
  105. {
  106.     int t;
  107.     cin>>t;
  108.     while(t--){
  109.     sset();
  110.     scanf("%d",&n);
  111.     for(int i=1;i<n;i++)
  112.     {
  113.         int x,y;
  114.         scanf("%d%d",&x,&y);
  115.        adj[x].push_back(y);
  116.        adj[y].push_back(x);
  117.  
  118.     }
  119.     printf("%d\n",dfs(1,0,0,0));
  120.     }
  121.  
  122.     return 0;
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement