1 solutions

  • 1
    @ 2025-8-26 21:59:18

    将返回路径也搜一次即可(建一个反图即可)。

    放代码:

    #include<bits/stdc++.h>
    #define int long long
    #define D
    using namespace std;const int N=2e3+10;
    int e[N][N],er[N][N],d[N],dr[N];bool a[N][N],ar[N][N];
    struct n_{int u,w;bool operator>(const n_&n)const{return w>n.w;}};
    signed main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int n,m;cin>>n>>m;
    memset(e,0x3f,sizeof e);memset(er,0x3f,sizeof er);
    memset(d,0x3f,sizeof d);memset(dr,0x3f,sizeof dr);
    for(int i=1;i<=m;i++){int u,v,w;cin>>u>>v>>w;e[u][v]=er[v][u]=min(w,e[u][v]);a[u][v]=ar[v][u]=1;}
    priority_queue<n_,vector<n_>,greater<n_>>q;n_ nd;nd.u=1;nd.w=0;d[1]=dr[1]=0;q.push(nd);
    while(!q.empty()){int u=q.top().u;q.pop();
    for(int v=1;v<=n;v++)if(a[u][v]&&d[v]>d[u]+e[u][v]){d[v]=d[u]+e[u][v];q.push({v,d[v]});}}
    q.push(nd);while(!q.empty()){int u=q.top().u;q.pop();
    for(int v=1;v<=n;v++)if(ar[u][v]&&dr[v]>dr[u]+er[u][v]){dr[v]=dr[u]+er[u][v];q.push({v,dr[v]});}}
    #ifdef D
    for(int i=1;i<=n;i++)cerr<<d[i]<<" ";cerr<<"\n";
    for(int i=1;i<=n;i++)cerr<<dr[i]<<" ";cerr<<"\n";
    #endif
    int ans=0;for(int v=2;v<=n;v++)ans+=d[v]+dr[v];cout<<ans;
    return 0;
    }
    
    • 1

    Information

    ID
    5740
    Time
    1000ms
    Memory
    125MiB
    Difficulty
    3
    Tags
    # Submissions
    131
    Accepted
    32
    Uploaded By