题解 CF1338D 【Nested Rubber Bands】
考虑有三个环
-
-
不存在若干个顺次连接的环与
a,c 分别相交,但是与b 不相交。
对于第一个限制,选出来的点是独立集即可。
对于第二个限制,与
所以对于合法序列
那么剩下的就是一个很简单的树形 dp 了,复杂度为
#include<bits/stdc++.h>
using namespace std;
#define V inline void
#define FOR(i,a,b) for(int i=a;i<=b;i++)
const int N=2e5+1;
vector<int>e[N];
int n,ans,f[N],g[N];
V add_edge(int x,int y){e[x].push_back(y),e[y].push_back(x);}
V cmax(int&x,int y){if(x-y>>31)x=y;}
V dfs(int u,int fa=0){
int d=e[u].size();
for(int v:e[u])if(v!=fa){
dfs(v,u);
cmax(ans,max(f[u]+g[v]+1,g[u]+f[v]+d-2));
cmax(f[u],g[v]),cmax(g[u],f[v]);
}
cmax(ans,++f[u]),cmax(ans,g[u]+=d-1-!!fa),cmax(f[u],g[u]);
}
int main(){
scanf("%d",&n);
for(int x,y;--n;add_edge(x,y))scanf("%d%d",&x,&y);
dfs(1),cout<<ans;
return 0;
}