有没有大佬救救我
查看原帖
有没有大佬救救我
705725
P_VICVIC_R楼主2024/9/10 21:44

rt,全WA

#include <bits/stdc++.h>
#define int long long 
using namespace std;
static const int N=5e6+1e5;

int n,m,Q;
struct Graph{
    struct Edge{
        int to,vl,Nxt;
    }e[N];
    int tot=1;
    int Sign[N];
    inline void add(int fr,int to,int vl){
        tot++;
        e[tot].vl=vl;
        e[tot].to=to;
        e[tot].Nxt=Sign[fr];
        Sign[fr]=tot;
    }
}G1,G2;
int Dfn[N],Low[N],tim;
int Fro[N],Dis[N],Dep[N],PreDis[N],CirDis[N],PCnt;
inline void Build(int fr,int to,int vl){
    PCnt++;
    int sum=vl;
    for(int P=to;P!=Fro[fr];P=Fro[P]){
        CirDis[P]=sum;
        sum+=PreDis[P];
    }
    CirDis[PCnt+n]=CirDis[fr];
    CirDis[fr]=0;
    for(int P=to;P!=Fro[fr];P=Fro[P]){
        int prsm=min(CirDis[P],CirDis[PCnt+n]-CirDis[P]);
        G2.add(PCnt+n,P,prsm);
        G2.add(P,PCnt+n,prsm);
    }
}
inline void Tarjan(int rt,int fr){
    Dfn[rt]=Low[rt]=++tim;
    for(int i=G1.Sign[rt];i;i=G1.e[i].Nxt){
        int to=G1.e[i].to;
        int vl=G1.e[i].vl;
        if(!Dfn[to]){
            Fro[to]=rt;
            PreDis[to]=vl;
            Tarjan(to,rt);
            Low[rt]=min(Low[rt],Low[to]);
        }
        else if(to!=fr){
            Low[rt]=min(Low[rt],Dfn[to]);
        }
        if(Low[to]>Dfn[rt]){
            G2.add(rt,to,vl);
            G2.add(to,rt,vl);
        }
    }
    for(int i=G1.Sign[rt];i;i=G1.e[i].Nxt){
        int to=G1.e[i].to;
        int vl=G1.e[i].vl;
        if(Fro[to]==rt or Dfn[to]<=Dfn[rt])
            continue;
        Build(rt,to,vl);
    }
}

int Siz[N],Top[N],Chi[N];
inline void Run(int rt,int fr){
    Fro[rt]=fr;
    Siz[rt]=1;
    for(int i=G2.Sign[rt];i;i=G2.e[i].Nxt){
        int to=G2.e[i].to;
        int vl=G2.e[i].vl;
        if(to==fr)
            continue;
        Dep[to]=Dep[rt]+1;
        Dis[to]=Dis[rt]+vl;
        Run(to,rt);
        Siz[rt]+=Siz[to];
        if(Siz[to]>Siz[Chi[rt]] or !Chi[rt])
            Chi[rt]=to;
    }
}
inline void Cutting(int rt,int tp){
    Top[rt]=tp;
    if(!Chi[rt])
        return;
    Cutting(Chi[rt],tp);
    for(int i=G2.Sign[rt];i;i=G2.e[i].Nxt){
        int to=G2.e[i].to;
        if(to!=Chi[rt] and to!=Fro[rt])
            Cutting(to,to);
    }
}
inline int LCA(int x,int y){
    while(Top[x]!=Top[y]){
        if(Dep[Top[x]]<Dep[Top[y]])
            swap(x,y);
        x=Fro[Top[x]];
    }
    return Dep[x]>Dep[y]?y:x;
}
inline int GetSon(int rt,int P){
    int res;
    while(Top[rt]!=Top[P]){
        res=Top[rt];
        rt=Fro[Top[rt]];
    }
    return rt==P?res:Chi[rt];
}

signed main(){
    std::cin.tie(nullptr)->sync_with_stdio(false);
    std::cout.tie(nullptr)->sync_with_stdio(false);
    cin>>n>>m>>Q;
    for(int i=1;i<=m;i++){
        int x,y,z;
        cin>>x>>y>>z;
        G1.add(x,y,z);
        G1.add(y,x,z);
    }
    Tarjan(1,0);
    Run(1,0);
    Cutting(1,1);
    for(int i=1;i<=Q;i++){
        int x,y;
        cin>>x>>y;
        int P=LCA(x,y);
        if(P<=n)
            cout<<Dis[x]+Dis[y]-2*Dis[P];
        else{
            int X=GetSon(x,P);
            int Y=GetSon(y,P);
            int Len=abs(CirDis[X]-CirDis[Y]);
            cout<<min(Len,CirDis[P]-Len)+Dis[x]-Dis[X]+Dis[y]-Dis[Y];
        }
        cout<<'\n';
    }
    return 0;
}
2024/9/10 21:44
加载中...