1 条题解

  • 1
    @ 2022-7-20 21:26:37
    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    const int maxn=200010;
    struct edge{
        int to,next,w;
    }e[maxn<<1];
    int n,m,cnt;
    int dis1[maxn],dis2[maxn],last[maxn];
    int st,ed;
    inline void add(int u,int v,int w){
        cnt++;
        e[cnt].to=v;
        e[cnt].next=last[u];
        last[u]=cnt;
        e[cnt].w=w;
    }
    void dfs1(int u,int fa){
        for(int i=last[u];i;i=e[i].next){
            int v=e[i].to;
            if(v==fa) continue;
            dis1[v]=dis1[u]+e[i].w;
            if(dis1[v]>dis1[st]) st=v;
            dfs1(v,u);
        }
    }
    void dfs2(int u,int fa){
        for(int i=last[u];i;i=e[i].next){
            int v=e[i].to;
            if(v==fa) continue;
            dis2[v]=dis2[u]+e[i].w;
            if(dis2[v]>dis2[ed]) ed=v;
            dfs2(v,u);
        }
    }
    void dfs3(int u,int fa){
        for(int i=last[u];i;i=e[i].next){
            int v=e[i].to;
            if(v==fa) continue;
            dis1[v]=dis1[u]+e[i].w;
            dfs3(v,u);
        }
    }
    void dfs4(int u,int fa){
        for(int i=last[u];i;i=e[i].next){
            int v=e[i].to;
            if(v==fa) continue;
            dis2[v]=dis2[u]+e[i].w;
            dfs4(v,u);
        }
    }
    signed main(){
        cin>>n>>m;
        for(int i=1,u,v,w;i<=m;i++){
            scanf("%lld %lld %lld",&u,&v,&w);
            add(u,v,w),add(v,u,w);
        }
        dfs1(1,0);
        dfs2(st,0);
        int ans=dis2[ed];
        memset(dis1,0,sizeof(dis1)),memset(dis2,0,sizeof(dis2));
        dfs3(st,0),dfs4(ed,0);
        int tmp=0;
        for(int i=1;i<=n;i++){//枚举点C
            int d=min(dis1[i],dis2[i]);
            if(d>tmp) tmp=d;
        }
        ans+=tmp;
        cout<<ans;
    }
    
    • 1

    信息

    ID
    3339
    时间
    1000ms
    内存
    125MiB
    难度
    5
    标签
    递交数
    7
    已通过
    5
    上传者