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 }

 

posted @ 2018-05-07 18:51  bloglxc  阅读(360)  评论(0编辑  收藏  举报