zoukankan      html  css  js  c++  java
  • HDU 1874 畅通工程续

    畅通工程续

    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 39915    Accepted Submission(s): 14754


    Problem Description
    某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。

    现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
     
    Input
    本题目包含多组数据,请处理到文件结束。
    每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。
    接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城镇A和城镇B之间有一条长度为X的双向道路。
    再接下一行有两个整数S,T(0<=S,T<N),分别代表起点和终点。
     
    Output
    对于每组数据,请在一行里输出最短需要行走的距离。如果不存在从S到T的路线,就输出-1.
     
    Sample Input
    3 3 0 1 1 0 2 3 1 2 1 0 2 3 1 0 1 1 1 2
     
    Sample Output
    2 -1
     
    Author
    linle
     
    Source
     
    Recommend
    lcy
     
     
     1 #include <cstdio>
     2 #include <cstring>
     3 #include <vector>
     4 #include <queue>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 const int maxn = 1050;
     9 const int INF = 0x7ffffff;
    10 
    11 struct Edge {
    12     int from, to, dist;
    13     Edge(int u, int v, int d) :from(u), to(v), dist(d) {}
    14 };
    15 
    16 struct HeapNode {
    17     int d, u;
    18     HeapNode(int dv, int uv) :d(dv), u(uv){}
    19     bool operator < (const HeapNode& rhs) const {
    20         return d > rhs.d;
    21     }
    22 };
    23 struct Dijkstra {
    24     int n, m;
    25     Dijkstra(){};
    26     Dijkstra(int nv, int mv) :n(nv), m(mv){}
    27     vector<Edge> edges;
    28     vector<int> G[maxn];
    29     bool done[maxn]; //是否已永久标号
    30     int d[maxn]; //s到各个点的距离
    31     //int p[maxn]; //最短路中的上一条弧
    32     void init(int n) {
    33         this->n = n;
    34         for (int i = 0; i < n; i++) G[i].clear();
    35         edges.clear();
    36     }
    37     void AddEdge(Edge e) {
    38         edges.push_back(e);
    39         m = edges.size();
    40         G[e.from].push_back(m - 1);
    41     }
    42     void dijkstra(int s) {
    43         priority_queue<HeapNode> Q;
    44         for (int i = 0; i < n; i++) d[i] = INF;
    45         d[s] = 0;
    46         memset(done, 0, sizeof(done));
    47         Q.push(HeapNode(0, s));
    48         while (!Q.empty()) {
    49             HeapNode x = Q.top(); Q.pop();
    50             int u = x.u;
    51             if (done[u]) continue;
    52             done[u] = true;
    53             for (int i = 0; i < G[u].size(); i++) {
    54                 Edge& e = edges[G[u][i]];
    55                 if (d[e.to] > d[u] + e.dist) {
    56                     d[e.to] = d[u] + e.dist;
    57                     //p[e.to] = G[u][i];
    58                     Q.push(HeapNode(d[e.to],e.to));
    59                 }
    60             }
    61         }
    62     }
    63 };
    64 
    65 int main()
    66 {
    67     int m, n, a, b, r,ans,temp,s,t;
    68     Dijkstra d;
    69     while (scanf("%d%d", &n, &m) == 2)
    70     {
    71         ans = 0;
    72         d.n=n; d.init(n);
    73         for (int i = 0; i < m; i++)
    74         {
    75             scanf("%d%d%d", &a, &b, &r);
    76             d.AddEdge(Edge(a, b, r));
    77             d.AddEdge(Edge(b, a, r));
    78         }
    79         scanf("%d%d",&s,&t);
    80         d.dijkstra(s);
    81         if(d.d[t]!=INF) printf("%d
    ", d.d[t]);
    82         else  printf("-1
    ");
    83     }
    84 }
  • 相关阅读:
    【SpringBoot】 理解SpringBoot的启动原理
    【SpringBoot】SpringBoot的基础,全面理解bean的生命周期
    【转】 Linux 命令解释(Linux基础二)
    【转】 Linux 的目录详解 (Linux基础一)
    【SpringBoot】 一种解决接口返回慢的方式
    【Jmeter基础】 Linux上运行Jmeter
    【SpingBoot】 测试如何使用SpringBoot搭建一个简单后台1
    单例模式@Singleton在测试中的运用
    性能测试基础 ---TCP通信过程的状态码与过程,以及出现错误码的分析(TIME_WAIT,CLOSE_WAIT)
    Spring5源码分析(007)——IoC篇之加载BeanDefinition总览
  • 原文地址:https://www.cnblogs.com/cumulonimbus/p/5185075.html
Copyright © 2011-2022 走看看