很多题都是这个套路,第一遍树形dp,第二遍邻位容斥转移
注意讨论清楚转移方式
码:
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
#define N 400005
vector<int>v[N];
int f1[N],f2[N],a,b,ans,n,m,i;
void dfs(int o,int fa)
{
int i;
f1[o]=1;
f2[o]=1;
for(i=0;i<v[o].size();i++)
{
int nd=v[o][i];
if(nd==fa)continue;
dfs(nd,o);
if(f1[nd]>f1[o]){f2[o]=f1[o];f1[o]=f1[nd];
}
else
{
if(f1[nd]>f2[o])f2[o]=f1[nd];
if(f2[nd]>f2[o])f2[o]=f2[nd];
}
}
f1[o]+=v[o].size()-1;
f2[o]+=v[o].size()-1;
}
void dfs2(int o,int fa)
{int i;
if(o==1)ans=max(ans,int(f1[o]-(v[o].size()-1)+f2[o]-(v[o].size()-1)+v[o].size()-1));
else
ans=max(ans,int((f1[fa]-v[fa].size()+1==f1[o]?f2[fa]:f1[fa])+f1[o]));
for(i=0;i<v[o].size();i++)
{
int nd=v[o][i];
if(nd==fa)continue;
dfs2(nd,o);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
v[a].push_back(b);
v[b].push_back(a);
}
dfs(1,0);
dfs2(1,0);
printf("%d",ans);
}