Roadblocks

Roadblocks

该题的难点在于求次短路,而次短路的求法与最短路基本一致,更新的方式就是当当前权重比最短路大且比次短路小的时候就更新它,如果它比最短路小,那么就把它和最短路交换一下

关键代码:

//d1[i]是从起点到达i的当前最短路
//d2[i]是从起点到达i的当前次短路
if(d1[u]>t){
    swap(d1[u], t);
    q.push({d1[u], u});
}
if(d2[u]>t && d1[u]<t){
    d2[u]=t;
    q.push({d2[u], u});
}

代码:

// Created by CAD on 2020/1/18.
#include <iostream>
#include <queue>
#define fi first
#define se second
#define inf 0x3f3f3f3f
#define pii pair<int,int>
using namespace std;

const int maxn=5005;
vector<pii> G[maxn];    //fi->to,se->weight
int d1[maxn],d2[maxn];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,r;    cin>>n>>r;
    for(int i=1;i<=r;++i)
    {
        int u,v,w;
        cin>>u>>v>>w;
        G[u].push_back({v,w});
        G[v].push_back({u,w});
    }
    priority_queue<pii,vector<pii>,greater<pii> >q;     //fi->w,se->v
    fill(d1, d1+maxn, inf);fill(d2, d2+maxn, inf);
    d1[1]=0, d1[0]=0;
    q.push({0,1});
    while(!q.empty())
    {
        pii now=q.top();q.pop();
        int v=now.se;
        if(d2[v]<now.fi) continue;
        for(int k=0;k<G[v].size(); ++k)
        {
            pii j=G[v][k];
            int t=now.fi+j.se,u=j.fi;
            if(d1[u]>t){
                swap(d1[u], t);
                q.push({d1[u], u});
            }
            if(d2[u]>t && d1[u]<t){
                d2[u]=t;
                q.push({d2[u], u});
            }
        }
    }
    cout << d2[n] << endl;
    return 0;
}
全部评论

相关推荐

挣K存W养DOG:入职送金条全球游,路过缅甸停一下🐔
点赞 评论 收藏
分享
有趣的牛油果开挂了:最近这个阶段收到些杂七杂八的短信是真的烦
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务