代码:
#include <iostream>
#include <vector>
using namespace std;
const int SIZE=3e5+10;
int n,m,f[SIZE][2],siz[SIZE],cho[SIZE][2],rn;
vector<int> edge[SIZE];
int dfs(int u,int fh){
siz[u]=1;
for(int v:edge[u]){
if(v==fh) continue;
int ff=dfs(v,u);
if(ff+1>f[u][0]||(ff+1==f[u][0]&&siz[cho[u][0]]<=siz[v]))
f[u][1]=f[u][0],f[u][0]=ff+1,cho[u][1]=cho[u][0],cho[u][0]=v;
else if(ff+1>f[u][1]||(ff+1==f[u][1]&&siz[cho[u][1]]<=siz[v])) f[u][1]=ff+1,cho[u][1]=v;
siz[u]+=siz[v];
}
// cout<<f[u][0]<<" "<<cho[u][0]<<" "<<f[u][1]<<" "<<cho[u][1]<<" "<<u<<endl;
if(f[rn][0]+f[rn][1]<f[u][0]+f[u][1]) rn=u;
return f[u][0];
}
int get(int u,int fh){
if(cho[u][0]==0) return 1;
return get(cho[u][0],u)+1+edge[u].size()-2;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int a,b;
cin>>a>>b;
edge[a].push_back(b);
edge[b].push_back(a);
}
dfs(1,0);
cout<<get(cho[rn][0],rn)+get(cho[rn][1],rn)+1+edge[1].size()-2<<endl;
return 0;
}