码迷,mamicode.com
首页 > 数据库 > 详细

Roadblocks

时间:2020-01-18 18:06:29      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:vector   with   ios   tin   cin   block   cond   air   代码   

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

标签:vector   with   ios   tin   cin   block   cond   air   代码   

原文地址:https://www.cnblogs.com/CADCADCAD/p/12209770.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!