20分AC#3#4蒟蒻求助!!!
查看原帖
20分AC#3#4蒟蒻求助!!!
648772
Liyuqiao11楼主2024/3/14 21:26
#include<bits/stdc++.h>
using namespace std;
const int N = 5010;
#define int long long
//思路是求出每颗子树内的直径,然后对于断一条边,就相当于把这条边连的两个端点断成两颗树进行合并,直接让它们的中点合并在一块就好了
int n,dis[N],dis2[N],dis3[N],dep[N],ans[N],vis[N],maxn,fr[N];
vector<pair<int,int> > G[N];
void dfs(int x,int fa){
    dep[x]=dep[fa]+1;
    for(int i=0;i<G[x].size();i++){
        int v=G[x][i].first,w=G[x][i].second;
        if(v==fa) continue;
        fr[v]=w;
        dfs(v,x);
    }
}
void dfs2(int x,int fa,int p){
    vis[x]=1;
    for(int i=0;i<G[x].size();i++){
        int v=G[x][i].first,w=G[x][i].second;
        if(v==fa||dep[v]<dep[p]) continue;
        dis[v]=dis[x]+w;
        dfs2(v,x,p);
    }
}
void dfs3(int x,int fa){
    for(int i=0;i<G[x].size();i++){
        int v=G[x][i].first,w=G[x][i].second;
        if(v==fa||vis[v]) continue;
        dis[v]=dis[x]+w;
        dfs3(v,x);
    }
}
signed main(){
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n-1;i++){
        int x,y,w;
        cin>>x>>y>>w;
        G[x].push_back(make_pair(y,w));
        G[y].push_back(make_pair(x,w));
    }
    dfs(1,0);
    for(int i=2;i<=n;i++){
        for(int j=1;j<=n;j++) vis[j]=0,dis[j]=0,dis2[j]=0,dis3[j]=0;
        dfs2(i,0,i);
        int bz=0,t=0;
        for(int j=1;j<=n;j++){
            if(dis[j]>dis2[i]){
                dis2[i]=dis[j];
                bz=j;
            }
        }
        if(bz!=0){   
            for(int j=1;j<=n;j++) dis[j]=0;
            dis2[i]=0;
            dfs2(bz,0,i);
            for(int j=1;j<=n;j++){
                if(dis[j]>dis2[i]){
                    dis2[i]=dis[j];
                    t=j;
                }
                dis3[j]=dis[j];
            }
            for(int j=1;j<=n;j++) dis[j]=0;
            dfs2(t,0,i);
            ans[i]=1e18;
            for(int j=1;j<=n;j++){
                dis3[j]=max(dis3[j],dis[j]);
                if(dis3[j]!=0) ans[i]=min(ans[i],dis3[j]);
            }
        }
        for(int j=1;j<=n;j++) dis[j]=0,dis2[j]=0,dis3[j]=0;
        dfs3(1,0);
        bz=0,t=0,maxn=0;
        for(int j=1;j<=n;j++){
            if(dis[j]>maxn){
                maxn=dis[j];
                bz=j;
            }
        }
        for(int j=1;j<=n;j++) dis[j]=0;
        maxn=0;
        dfs3(bz,0);
        for(int j=1;j<=n;j++){
            if(dis[j]>maxn){
                maxn=dis[j];
                t=j;
            }
            dis3[j]=dis[j];
        }
        for(int j=1;j<=n;j++) dis[j]=0;
        dfs3(t,0);
        int cnt=1e18;
        for(int j=1;j<=n;j++){
            dis3[j]=max(dis3[j],dis[j]);
            if(dis3[j]!=0) cnt=min(cnt,dis3[j]);
        }
        ans[i]=max(ans[i]+cnt+fr[i],max(cnt,ans[i]));
    }
    int final_ans=1e18;
    for(int i=2;i<=n;i++) final_ans=min(final_ans,ans[i]);
    cout<<final_ans<<endl;
    return 0;
}
2024/3/14 21:26
加载中...