zoukankan      html  css  js  c++  java
  • codevs 1269 匈牙利游戏

            codevs 1269 匈牙利游戏

    题目描述 Description

    Welcome to the Hungary Games! The streets of Budapest form a twisted network of one-way streets.

    欢迎来到匈牙利游戏!布达佩斯(匈牙利首都)的街道形成了一个弯曲的单向网络。

    You have been forced to join a race as part of a “Reality TV” show where you race through these streets, starting at the Sz´echenyi thermal bath (s for short) and ending at the Tomb of G¨ ul Baba (t for short).

    你被强制要求参加一个赛跑作为一个TV秀的一部分节目,比赛中你需要穿越这些街道,从s开始,到t结束。

    Naturally, you want to complete the race as quickly as possible, because you will get more promo- tional contracts the better you perform.

    很自然的,你想要尽快的完成比赛,因为你的比赛完成的越好,你就能得到更多的商业促销合同。

    However, there is a catch: any person who is smart enough to take a shortest s-t route will be thrown into the P´alv¨olgyi cave system and kept as a national treasure. You would like to avoid this fate, but still be as fast as possible. Write a program that computes a strictly-second-shortest s-t route.

    但是,有一个需要了解的是,如果有人过于聪明找到从s到t的最短路线,那么他就被扔到国家极品人类保护系统中作为一个国家宝藏收藏起来。你显然要避免这种事情的发生,但是也想越快越好。写一个程序来计算一个从s到t的严格次短路线吧。

    Sometimes the strictly-second-shortest route visits some nodes more than once; see Sample Input 2 for an example.

    有的时候,严格次短路线可能访问某些节点不止一次。样例2是一个例子。

    输入描述 Input Description

    The first line will have the format N M, where N is the number of nodes in Budapest and M is the number of edges. The nodes are 1,2,...,N; node 1 represents s; node N represents t. Then there are M lines of the form A B L, indicating a one-way street from A to B of length L. You can assume that A != B on these lines, and that the ordered pairs (A,B) are distinct.

    第一行包含两个整数N和M,N代表布达佩斯的节点个数,M代表边的个数。节点编号从1到N。1代表出发点s,N代表终点t。接下来的M行每行三个整数A B L,代表有一条从A到B的长度为L的单向同路。你可以认为A不等于B,也不会有重复的(A,B)对。

    输出描述 Output Description

    Output the length of a strictly-second-shortest route from s to t. If there are less than two possible lengths for routes from s to t, output −1.

    输出从s到t的严格次短路的长度。如果从s到t的路少于2条,输出-1。

    样例输入 Sample Input

    样例输入1:

    4 6

    1 2 5

    1 3 5

    2 3 1

    2 4 5

    3 4 5

    1 4 13

    样例输入2:

    2 2

    1 2 1

    2 1 1

    样例输出 Sample Output

    样例输出1:

    11

    样例输出2:

    3

    数据范围及提示 Data Size & Hint

    对于样例1:

    There are two shortest routes of length 10 (1 → 2 → 4,1 → 3 → 4) and the strictly-second- shortest route is 1 → 2 → 3 → 4 with length 11.

    对于样例2:

    The shortest route is 1 → 2 of length 1, and the strictly-second route is 1 → 2 → 1 → 2 of length 3.

    思路:次短路模板  注意要判断该图中是否有最短路

    #include <cstring>
    #include <cstdio>
    #include <queue>
    using namespace std;
    
    #define LOOP(i, n) for (int i = 1; i <= n; ++i)
    const int MAX_NODE = 50005;
    const int MAX_EDGE = 100005 << 1;
    const int INF = 0x3f3f3f3f;
    
    struct Node;
    struct Edge;
    
    struct Node {
        int Id, Dist, Dist2;
        bool Inq;
        Edge *Head;
    } _nodes[MAX_NODE], *Start, *Target;
    int _vCount;
    
    struct Edge {
        int Weight;
        Node *From, *To;
        Edge *Next;
        Edge() {}
        Edge(Node *from, Node *to, Edge *next, int weight) :
            From(from), To(to), Next(next), Weight(weight) {}
    } *_edges[MAX_EDGE];
    int _eCount;
    
    void Init(int vCount) {
        memset(_nodes, 0, sizeof _nodes);
        _vCount = vCount;
        _eCount = 0;
        Start = 1 + _nodes;
        Target = vCount + _nodes;
    }
    
    void AddEdge(Node *from, Node *to, int weight) {
        Edge *e = _edges[++_eCount] = new Edge(from, to, from->Head, weight);
        e->From->Head = e;
    }
    
    void Build(int uId, int vId, int weight) {
        Node *u = uId + _nodes, *v = vId + _nodes;
        u->Id = uId;
        v->Id = vId;
        AddEdge(u, v, weight);
    }
    
    void SPFA() {
        LOOP(i, _vCount)
        _nodes[i].Dist = _nodes[i].Dist2 = INF;
        static queue<Node*> q;
        Start->Dist = 0;
        Start->Dist2 = INF;
        Start->Inq = true;
        q.push(Start);
        while (!q.empty()) {
            Node *u = q.front();
            q.pop();
            u->Inq = false;
            for (Edge *e = u->Head; e; e = e->Next) {
                bool relaxOk = false;
                if (u->Dist + e->Weight < e->To->Dist) {
                    e->To->Dist2 = e->To->Dist;
                    e->To->Dist = u->Dist + e->Weight;
                    relaxOk = true;
                }
                else if (u->Dist + e->Weight > e->To->Dist && u->Dist + e->Weight < e->To->Dist2) {
                    e->To->Dist2 = u->Dist + e->Weight;
                    relaxOk = true;
                }
                if (u->Dist2 + e->Weight < e->To->Dist2) {
                    e->To->Dist2 = u->Dist2 + e->Weight;
                    relaxOk = true;
                }
                if (relaxOk && !e->To->Inq) {
                    e->To->Inq = true;
                    q.push(e->To);
                }
            }
        }
    }
    
    int main() {
        int totNode, totEdge;
        int uId, vId, weight;
        scanf("%d%d", &totNode, &totEdge);
        Init(totNode);
        LOOP(i, totEdge) {
            scanf("%d%d%d", &uId, &vId, &weight);
            Build(uId, vId, weight);
        }
        SPFA();
        if (Target->Dist2 == INF) printf("-1
    ");
        else printf("%d
    ", Target->Dist2);
        return 0;
    }
  • 相关阅读:
    DataPipeline合伙人&CPO陈雷:成为中国的世界级数据中间件厂商
    数字化转型提速,DataPipeline助力中石油产业大数据实时共享能力再提升
    IT168专访|DataPipeline 合伙人&CPO陈雷:我们致力于成为中国的世界级数据中间件厂商
    Odoo 新老版本关于action window动作绑定的两种写法
    关于 错误"ERROR:RELAXNGV:RELAXNG_ERR_EXTRACO NTENT: Element openerp has extra content: data"的处理
    Odoo 前期各版本的协议变化对比
    如何让odoo在执行如PG、Less编译等调用时出现的异常信息打印出来
    Odoo14 官方新版docker镜像跑起来网站页面异常 元素 '<xpath expr="//*[hasclass('o_footer_copyright_name')]">' 在母级视图中没有找到
    一种将历史地图坐标配准到GIS中的方法
    水利地理信息系统
  • 原文地址:https://www.cnblogs.com/v-vip/p/9808302.html
Copyright © 2011-2022 走看看