直径+欲張り——cf 1294 F

6544 ワード

/*
       ,                
  :     +         
      ,         dfs      
*/
#include
using namespace std;
#define N 400005

vector<int>G[N];
int n,s,t,d[N],vis[N],id,Max;

void getdeep(int u,int pre){
    for(auto v:G[u]){
        if(v==pre)continue;
        d[v]=d[u]+1;
        getdeep(v,u);
    }
}

vector<int>path;
int getpath(int u,int pre){
    int flag=0;
    if(u==t){path.push_back(u);return 1;}
    for(auto v:G[u]){
        if(v==pre)continue;
        if(getpath(v,u))
            flag=1;
    }
    
    if(flag)path.push_back(u);
    return flag;
}

void dfs(int u,int pre){
    for(auto v:G[u]){
        if(vis[v] || v==pre)continue;
        d[v]=d[u]+1;
        dfs(v,u);
    }
}

int main(){
    cin>>n;
    for(int i=1;i){
        int u,v;scanf("%d%d",&u,&v);
        G[u].push_back(v);
        G[v].push_back(u);
    }    
    s=1;
    getdeep(s,s);
    for(int i=1;i<=n;i++)
        if(d[i]>d[s])s=i;
    
    memset(d,0,sizeof d);
    getdeep(s,s);
    for(int i=1;i<=n;i++)
        if(d[i]>d[t])t=i;
    int ans=d[t];
        
    getpath(s,s);
//    for(auto x:path)cout<
    memset(d,0,sizeof d);
    for(auto x:path)vis[x]=1;
    for(auto x:path)dfs(x,x);
    Max=-1;
    for(int i=1;i<=n;i++)if(!vis[i]){
        if(Maxi;
    }
    if(Max==-1){
        for(int i=1;i<=n;i++) 
            if(i!=s && i!=t)id=i;
        Max=0;
    }
    ans+=Max;
    
    cout<'
'; cout<" "<" "<'
'; }