Roadblocks

Roadblocks

题目描述

贝茜把家搬到了一个小农场,但她常常回到 FJ 的农场去拜访她的朋友。贝茜很喜欢路边的风景,不想那么快地结束她的旅途,于是她每次回农场,都会选择第二短的路径,而不象我们所习惯的那样,选择最短路。

贝茜所在的乡村有 \(R(1\leq R\leq10^5)\)条双向道路,每条路都连接了所有的\(N(1\leq N\leq 5000)\) 个农场中的某两个。贝茜居住在农场 \(1\),她的朋友们居住在农场\(N\) (即贝茜每次旅行的目的地)。

贝茜选择的第二短的路径中,可以包含任何一条在最短路中出现的道路,并且一条路可以重复走多次。当然第二短路的长度必须严格大于最短路(可能有多条)的长度,但它的长度必须不大于所有除最短路外的路径的长度。

输入描述

输入文件的第\(1\) 行为两个整数,\(N\)\(R\),用空格隔开;

\(2....R+1\) 行:每行包含三个用空格隔开的整数 \(A\)\(B\)\(D\) ,表示存在一条长度为\(D(1 \leq D \leq 5000)\) 的路连接农场 \(A\)和农场\(B\)

输出格式

输出仅一个整数,表示从农场\(1\) 到农场\(N\) 的第二短路的长度。

样例输入

4 4
1 2 100
2 4 200
2 3 250
3 4 100

样例输出

450

思路

用Dijkstra计算最短路径,因为要求求出严格次短路径,所用用两个数组记录,一个记录最短路径一个记录此段路经,跑Dijkstra即可

/****************************************************
/@Author: Kirito
/@TIME:   2020-04-30
/@FILENAME: Roadblocks.cpp
/@REMARK:    
/****************************************************/
#include <bits/stdc++.h>
#define lowbit(x) (x&(-x))
#define CSE(x,y) memset(x,y,sizeof(x))
#define INF 0x3f3f3f3f
#define Abs(x) (x>=0?x:(-x))
#define FAST ios::sync_with_stdio(false);cin.tie(0);
using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll , ll> pll;

const int maxn=211111;
//graph
int first[maxn],nxt[maxn],u[maxn],v[maxn],w[maxn];
int n,m,cnt;
//spfa-box
int dis[maxn],book[maxn],ans[maxn];
//邻接表
void add(int x,int y,int d){
    cnt++;
    u[cnt]=x;v[cnt]=y;w[cnt]=d;
    nxt[cnt]=first[u[cnt]];first[u[cnt]]=cnt;
    return;
}
//Dijkstra
void Dijkstra(){
    CSE(dis,INF);CSE(book,0);CSE(ans,INF);
    priority_queue<pii,vector<pii>,greater<pii>> box;
    box.push(make_pair(0,1));dis[1]=0;
    while(!box.empty()){
        int x=box.top().second,base=box.top().first;box.pop();
        for(int i=first[x];i!=-1;i=nxt[i]){
            int y=v[i];
            int d=w[i]+base;
            if(dis[y]>d){
                ans[y]=dis[y];
                dis[y]=d;
                box.push(make_pair(dis[y],y));
            }
            else if(dis[y]==d) continue;
            else if(ans[y]>d){
                ans[y]=d;
                box.push(make_pair(ans[y],y));
            }
        }
    }
    return ;
}

int main()
{
#ifndef ONLINE_JUDGE
    freopen("in.in","r",stdin);
#endif
    FAST;
    CSE(first,-1);CSE(nxt,-1);CSE(w,INF);
    cin>>n>>m;
    for(int i=0;i<m;i++){
        int x,y,d;
        cin>>x>>y>>d;
        add(x,y,d);add(y,x,d);
    }
    Dijkstra();
    cout<<ans[n]<<endl;
    return 0;
}

Roadblocks

上一篇:SQLAlchemy(二):SQLAlchemy对数据的增删改查操作、属性常用数据类型详解


下一篇:Modbus poll Modbus Slave使用