模板 树的直径求助
查看原帖
模板 树的直径求助
275860
___A__楼主2024/6/14 22:42

70pts 只有WA

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n,dfn[N],stamp,f[N],ring[N];
long long sum[N*2],Max[N],d1[N],d2[N];
map<pair<int,int>,int>mp;
vector<int>vec;
struct graph{
    int v,w,id;
};
vector<graph>g[N];
void dfs(int u,int last){
    dfn[u]=++stamp;
    for(auto [v,w,id]:g[u]){
        if(id!=last){
            if(dfn[v]){
                if(dfn[v]>dfn[u]){
                    vec.push_back(v),ring[v]=1;
                    while(v!=u){
                        v=f[v],vec.push_back(v),ring[v]=1;
                    }
                }
            }
            else{
                f[v]=u,dfs(v,id);
            }
        }
    }
}
void dfs1(int u,int last){
    for(auto [v,w,id]:g[u]){
        if(id!=last&&!ring[v]){
            dfs1(v,id);
            if(d1[v]+w>=d1[u]){
                d2[u]=d1[u],d1[u]=d1[v]+w;
            }
            else if(d1[v]+w>=d2[u]){
                d2[u]=d1[v]+w;
            }
        }
    }
}
signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>n;
    for(int u=1,v,w;u<=n;u++){
        cin>>v>>w,g[u].push_back({v,w,u}),g[v].push_back({u,w,u}),mp[{u,v}]=w;
    }
    long long ans=0;
    for(int i=1;i<=n;i++){
        if(!dfn[i]){
            long long num=0;
            vec.clear(),dfs(i,0),reverse(vec.begin(),vec.end());
            for(int i:vec){
                dfs1(i,0),num=max(num,d1[i]+d2[i]);
            }
            int len=vec.size();
            for(int i=0;i<len;i++){
                vec.push_back(vec[i]);
            }
            for(int i=1;i<vec.size();i++){
                sum[i]=sum[i-1]+mp[{vec[i-1],vec[i]}];
            }
            Max[len]=-1e18;
            for(int i=len-1;i>=1;i--){
                Max[i]=max(Max[i+1],d1[vec[i]]+sum[i]);
            }
            for(int i=0;i<len;i++){
                num=max(num,d1[vec[i]]+Max[i+1]-sum[i]);
            }
             for(int i=len-1;i>=1;i--){
                Max[i]=max(Max[i+1],d1[vec[i]]-sum[i]);
            }
            for(int i=0;i<len;i++){
                num=max(num,d1[vec[i]]+Max[i+1]+sum[i+len]);
            }
            ans+=num;
        }
    }
    cout<<ans;
}
2024/6/14 22:42
加载中...