Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- typedef long double ld;
- int n;
- const int MX=1e5+4;
- vector<int> adj[MX];
- int dp[MX][3][2];
- int memo[MX][4][2];
- int memory[MX][2];
- int dfs(int x,int pa,bool f,int d);
- int nig(int x,int pa,int t,int y,bool f)
- {
- if(y==(int)adj[x].size())
- {
- if(t==0)return 0;
- return -1e5-4;
- }
- if(memo[y][t][f]!=-1)return memo[y][t][f];
- int ans=0;
- int ch=adj[x][y];
- if(ch==pa)return memo[y][t][f]=max(nig(x,pa,t,y+1,f),nig(x,pa,t-!f,y+1,f));
- if(t)
- ans=nig(x,pa,t-1,y+1,f)+dfs(ch,x,0,2);
- ans=max(ans,nig(x,pa,t,y+1,f)+dfs(ch,x,0,1));
- //if(x==2)cout<<ans<<' ';
- return memo[y][t][f]=ans;
- }
- int dfs(int x,int pa,bool f,int d)
- {
- int ans=0;
- int ret=0;
- bool star=0;
- if(dp[x][d][f]!=-1)return dp[x][d][f];
- if(d)
- {
- for(auto u:adj[x])
- {
- if(u==pa)continue;
- ans+=dfs(u,x,1,d-1);
- }
- return dp[x][d][f]=ans;
- }
- if(adj[x].size()>=3+f)star =1;
- ans=0;
- for(auto u : adj[x])
- {
- if(u==pa)continue;
- ans+=dfs(u,x,1,0);
- }
- ret=max(ret,ans);
- if(!star){
- ans=0;
- // cout<<x<<'#'<<endl;
- for(auto u : adj[x])
- {
- if(u==pa)continue;
- ans+=dfs(u,x,0,0);
- }
- return dp[x][d][f]=max(ans,ret);
- }
- //take a star and delete all sons but 3 sons
- if(memory[x][f]!=-1){ret=max(ret,memory[x][f]);return dp[x][d][f]=ret;}
- for(int i=0;i<=adj[x].size();i++)
- for(int k=0;k<4;k++)
- for(int j=0;j<2;j++)
- memo[i][k][j]=-1;
- ans=1;
- ans+=nig(x,pa,3,0,f);
- //if(f==0)if(x==2)cout<<"Y";
- //cout<<x<<' '<<f<<' '<<ans<<endl;
- memory[x][f]=ans;
- ret=max(ret,ans);
- // if(x==1)cout<<ret<<endl;
- ans=0;
- for(auto u : adj[x])
- {
- if(u==pa)continue;
- ans+=dfs(u,x,1,1);
- }
- int rr=ans;
- for(auto u : adj[x])
- {
- if(u==pa)continue;
- rr =max(rr,ans-dfs(u,x,1,1)+dfs(u,x,0,0));
- }
- ret=max(rr,ret);
- return dp[x][d][f]=ret;
- }
- void sset()
- {
- memset(dp,-1,sizeof dp);
- memset(memory,-1,sizeof memory);
- for(int i=0;i<=n;i++)adj[i].clear();
- }
- int main()
- {
- int t;
- cin>>t;
- while(t--){
- sset();
- scanf("%d",&n);
- for(int i=1;i<n;i++)
- {
- int x,y;
- scanf("%d%d",&x,&y);
- adj[x].push_back(y);
- adj[y].push_back(x);
- }
- printf("%d\n",dfs(1,0,0,0));
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement