对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一个毛毛虫,点数越多,毛毛虫就越大。例如下图左边的树(图 1)抽出一部分就变成了右边的一个毛毛虫了(图 2)。
毛毛虫?
很明显,我们可以先预处理出每个点的入度。
显然最后的答案就是\sum{a_i}-(s-1)+1=\sum{a_i-1}+2(好好想想)
#include<bits/stdc++.h>
using namespace std;
int n,m,in[300010],Max,now;
vector<int> v[300010];
inline void DFS(int x,int fa,int sum){
if(sum>Max){
Max=sum;
now=x;
}
for(auto i:v[x])
if(fa!=i) DFS(i,x,sum+in[i]);
}
int main(){
scanf("%d%d",&n,&m);
for(int x,y,i=1;i<=m;i++){
scanf("%d%d",&x,&y);
v[x].push_back(y);
v[y].push_back(x);
in[x]++;in[y]++;
}
for(int i=1;i<=n;i++) in[i]--;
DFS(1,0,in[1]);
Max=0;
DFS(now,0,in[now]);
printf("%d\n",Max+2);
}