• Roadblocks


    Roadblocks

    题目描述

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

    贝茜所在的乡村有 (R(1leq Rleq10^5))条双向道路,每条路都连接了所有的(N(1leq Nleq 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;
    }
    
  • 相关阅读:
    (十)安装YAML
    (十四)日志
    Android自动化测试------monkeyrunner(六)
    Android自动化测试------monkey日志管理(五)
    如何学好一门编程语言
    linux vi hjkl由来
    .net 微服务CICD 好文章
    APPCMD 精心整理 有点赞的吗
    APPCMD 命令合集
    APPCMD 使用手册
  • 原文地址:https://www.cnblogs.com/LeafLove/p/12808057.html
Copyright © 2020-2023  润新知