• [BZOJ1726][Usaco2006 Nov]Roadblocks第二短路


    1726: [Usaco2006 Nov]Roadblocks第二短路

    Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1277  Solved: 607 [Submit][Status][Discuss]

    Description

    贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友。贝茜很喜欢路边的风景,不想那么快地结束她的旅途,于是她每次回农场,都会选择第二短的路径,而不象我们所习惯的那样,选择最短路。 贝茜所在的乡村有R(1<=R<=100,000)条双向道路,每条路都联结了所有的N(1<=N<=5000)个农场中的某两个。贝茜居住在农场1,她的朋友们居住在农场N(即贝茜每次旅行的目的地)。 贝茜选择的第二短的路径中,可以包含任何一条在最短路中出现的道路,并且,一条路可以重复走多次。当然咯,第二短路的长度必须严格大于最短路(可能有多条)的长度,但它的长度必须不大于所有除最短路外的路径的长度。

    Input

    * 第1行: 两个整数,N和R,用空格隔开

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

    Output

    * 第1行: 输出一个整数,即从农场1到农场N的第二短路的长度

    Sample Input

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


    Sample Output

    450

    输出说明:

        最短路:1 -> 2 -> 4 (长度为100+200=300)
        第二短路:1 -> 2 -> 3 -> 4 (长度为100+250+100=450)
     
    次短路模板题
    #include <queue>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    char buf[10000000], *ptr = buf - 1;
    inline int readint(){
        int n = 0;
        char ch = *++ptr;
        while(ch < '0' || ch > '9') ch = *++ptr;
        while(ch <= '9' && ch >= '0'){
            n = (n << 1) + (n << 3) + ch - '0';
            ch = *++ptr;
        }
        return n;
    }
    const int maxn = 5000 + 10, maxm = 100000 + 10;
    struct Edge{
        int to, val, next;
        Edge(){}
        Edge(int _t, int _v, int _n): to(_t), val(_v), next(_n){}
    }e[maxm * 2]; 
    int fir[maxn] = {0}, cnt = 0;
    inline void ins(int u, int v, int w){
        e[++cnt] = Edge(v, w, fir[u]); fir[u] = cnt;
        e[++cnt] = Edge(u, w, fir[v]); fir[v] = cnt;
    }
    
    struct Node{
        int dis, idx;
        Node(){}
        Node(int _d, int _i): dis(_d), idx(_i){}
        bool operator < (const Node &x) const {
            return dis > x.dis;
        }
    }t;
    priority_queue<Node> q;
    int dis1[maxn], dis2[maxn];
    void dijkstra(){
        memset(dis1, 0x3f, sizeof dis1);
        memset(dis2, 0x3f, sizeof dis2);
        dis1[1] = 0;
        q.push(Node(0, 1));
        int u, v, w;
        while(!q.empty()){
            t = q.top(); q.pop();
            u = t.idx;
            if(t.dis > dis2[u]) continue;
            for(int i = fir[u]; i; i = e[i].next){
                v = e[i].to;
                w = t.dis + e[i].val;
                if(dis1[v] > w){
                    swap(dis1[v], w);
                    q.push(Node(dis1[v], v));
                }
                if(dis1[v] < w && w < dis2[v]){
                    dis2[v] = w;
                    q.push(Node(dis2[v], v));
                }
            }
        }
    }
    int n, m;
    int main(){
        fread(buf, sizeof(char), sizeof(buf), stdin); 
        n = readint();
        m = readint();
        for(int u, v, w, i = 1; i <= m; i++){
            u = readint();
            v = readint();
            w = readint();
            ins(u, v, w);
        }
        dijkstra();
        printf("%d
    ", dis2[n]);
        return 0;
    }
  • 相关阅读:
    ArcGis Python脚本——遍历输出面或折线要素的折点坐标
    ArcGis Python脚本——根据接图表批量裁切分幅影像
    ArcGis安装失败提示“需要Microsoft .NET Framework 3.5 sp1或等效环境”的解决方法
    PLSQL Developer 远程连接Oracle数据库
    Oracle使用PLSQL导入数据后中文乱码的解决方法
    使用ArcMap做一个1:5000标准分幅图并编号
    ArcGis地理坐标系转投影坐标系问题的思考与处理
    CI框架 输入类
    PHP获取当前页面的URL作为参数以供下一层的页面可以返回上一层页面
    用js实现返回上一页
  • 原文地址:https://www.cnblogs.com/ruoruoruo/p/7486995.html
Copyright © 2020-2023  润新知