20分求条
查看原帖
20分求条
322792
Alea楼主2023/10/29 20:36

代码:

#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;
}
2023/10/29 20:36
加载中...