zoukankan      html  css  js  c++  java
  • pta 编程题20 旅游规划

    其它pta数据结构编程题请参见:pta

    题目

    这个最短路径问题只需要求两点之间的最短路径,因而在Dijikstra算法中当求出目标点的最短路径之后跳出循环即可。

      1 #include <iostream>
      2 using namespace std;
      3 
      4 struct Node
      5 {
      6     int length;
      7     int price;
      8 };
      9 
     10 int V, E;
     11 Node **G;
     12 
     13 void buildGraph();
     14 void deleteGraph();
     15 void dijkstra(int s, int d);
     16 int findMinDist(Node* dist, bool* collected);
     17 bool cmp(Node a, Node b);
     18 
     19 int main()
     20 {
     21     int S, D;
     22     cin >> V >> E >> S >> D;
     23     buildGraph();
     24     dijkstra(S, D);
     25     deleteGraph();
     26     return 0;
     27 }
     28 
     29 void buildGraph()
     30 {
     31     int a, b, l, p, i;
     32     G = new Node*[V];
     33     for (a = 0; a < V; a++)
     34     {
     35         G[a] = new Node[V];
     36         for (b = 0; b < V; b++)
     37         {
     38             G[a][b].length = INT_MAX;
     39             G[a][b].price = INT_MAX;
     40         }
     41     }
     42 
     43     for (i = 0; i < E; i++)
     44     {
     45         cin >> a >> b >> l >> p;
     46         G[a][b].length = l;
     47         G[a][b].price = p;
     48         G[b][a].length = l;
     49         G[b][a].price = p;
     50     }
     51 }
     52 
     53 void deleteGraph()
     54 {
     55     for (int i = 0; i < V; i++)
     56         delete[] G[i];
     57     delete[] G;
     58 }
     59 
     60 bool cmp(Node a, Node b)
     61 {
     62     if (a.length != b.length)
     63         return a.length < b.length;
     64     else
     65         return a.price < b.price;
     66 }
     67 
     68 int findMinDist(Node* dist, bool* collected)
     69 {
     70     int minV;
     71     Node minDist;
     72     minDist.length = INT_MAX;
     73     minDist.price = INT_MAX;
     74 
     75     for (int i = 0; i < V; i++)
     76     {
     77         if (!collected[i] && cmp(dist[i], minDist))
     78         {
     79             minDist = dist[i];
     80             minV = i;
     81         }
     82     }
     83 
     84     if (minDist.length == INT_MAX)
     85         return -1;
     86     else
     87         return minV;
     88 }
     89 
     90 void dijkstra(int s, int d)
     91 {
     92     int v, w;
     93     Node *dist, temp;
     94     bool *collected;
     95     dist = new Node[V];
     96     collected = new bool[V];
     97     for (v = 0; v < V; v++)
     98     {
     99         dist[v] = G[s][v];
    100         collected[v] = false;
    101     }
    102 
    103     dist[s].length = 0;
    104     dist[s].price = 0;
    105     collected[s] = true;
    106 
    107     while (true)
    108     {
    109         v = findMinDist(dist, collected);
    110         if (v == d) break;
    111         collected[v] = true;
    112 
    113         for (w = 0; w < V; w++)
    114         {
    115             if (!collected[w] && G[v][w].length < INT_MAX)
    116             {
    117                 temp.length = dist[v].length + G[v][w].length;
    118                 temp.price = dist[v].price + G[v][w].price;
    119                 if (cmp(temp, dist[w]))
    120                     dist[w] = temp;
    121             }
    122         }
    123     }
    124 
    125     cout << dist[d].length << " " << dist[d].price;
    126     delete dist;
    127     delete collected;
    128 }
  • 相关阅读:
    UVA10361
    △UVA10494
    △UVA465
    △UVA10106
    △UVA424
    阶乘的精确值
    小学生算术
    UVA156
    △UVA120
    linux应用之ntpdate命令联网同步时间
  • 原文地址:https://www.cnblogs.com/lxc1910/p/9004383.html
Copyright © 2011-2022 走看看