Roadblocks

Posted CADCADCAD

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

以上是关于Roadblocks的主要内容,如果未能解决你的问题,请参考以下文章

Roadblocks POJ 3255(次短路)

bzoj1726[Usaco2006 Nov]Roadblocks第二短路*

POJ——T 3255 Roadblocks|| COGS——T 315. [POJ3255] 地砖RoadBlocks || 洛谷—— P2865 [USACO06NOV]路障Roadblocks(

POJ-3255-Roadblocks POJ-Dijkstra+邻接表

POJ 3255 Roadblocks

bzoj1726Roadblocks