Roadblocks

时间:2021-12-24 02:58:44

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;
}