没单调队列优化但是有WA求助
查看原帖
没单调队列优化但是有WA求助
275860
___A__楼主2024/6/14 21:43

dfs找环 dfs1求直径 应该都没错

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+5;
int n,dfn[N],stamp,f[N],d1[N],d2[N],ring[N],sum[N];
map<int,map<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;
    }
    int ans=0;
    for(int i=1;i<=n;i++){
        if(!dfn[i]){
            int 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]];
            }
            for(int i=0;i<len;i++){
                for(int j=i+1;j<len;j++){
                    num=max(num,d1[vec[i]]+d1[vec[j]]+max(sum[j]-sum[i],sum[i+len]-sum[j]));
                }
            }
            ans+=num;
        }
    }
    cout<<ans;
}
2024/6/14 21:43
加载中...