สมมติว่าเรามี n เมืองที่เชื่อมต่อกันด้วยเที่ยวบิน m แต่ละเที่ยวบินเริ่มต้นจากคุณและมาถึงที่ v ด้วยราคา w หากเรามีเมืองและเที่ยวบินทั้งหมด พร้อมกับเมืองเริ่มต้น src และ dst ปลายทาง หน้าที่ของเราคือค้นหาราคาที่ถูกที่สุดจาก src ถึง dst โดยมีจุดจอดสูงสุด k แห่ง หากไม่มีเส้นทางดังกล่าว ให้กลับ -1
ดังนั้น หากอินพุตเป็น n =3, edge =[[0,1,100],[1,2,100],[0,2,500]], src =0, dst =2, k =1 ผลลัพธ์จะเป็น 200
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
สร้างโครงสร้างข้อมูลที่เรียกว่า Data ซึ่งสามารถเก็บ node, dist และ val ได้
-
กำหนดต้นทุนอาร์เรย์ 2 มิติหนึ่งรายการ
-
ราคา :=หนึ่งอาร์เรย์ 2 มิติของการสั่งซื้อ (n + 1) x (K + 10) เติมด้วยอินฟินิตี้
-
กำหนดกราฟอาร์เรย์ 3 มิติหนึ่งกราฟ
-
สำหรับการเริ่มต้น i :=0 เมื่อฉัน <ขนาดของเที่ยวบิน อัปเดต (เพิ่ม i ขึ้น 1) ให้ทำ −
-
u :=เที่ยวบิน[i, 0]
-
v :=เที่ยวบิน[i, 1]
-
แทรก { v, เที่ยวบิน[i, 2] } ที่ส่วนท้ายของกราฟ[u]
-
-
กำหนดลำดับความสำคัญหนึ่งคิว q
-
แทรก Data(src, 0, 0) ลงใน q
-
ราคา[src, 0] :=0
-
ตอบ :=-1
-
ในขณะที่ (ไม่ใช่ q ว่างเปล่า) ทำ -
-
temp :=องค์ประกอบด้านบนของ q
-
curr :=temp.node
-
ลบองค์ประกอบออกจาก q
-
dist :=temp.dist
-
ถ้าสกุลเงินเหมือนกับ dst แล้ว −
-
คืนค่า temp.cost
-
-
(เพิ่ม dist ขึ้น 1)
-
ถ้า dist> K + 1 แล้ว −
-
ละเว้นส่วนต่อไปนี้ ข้ามไปยังการทำซ้ำถัดไป
-
-
สำหรับการเริ่มต้น i :=0 เมื่อฉัน <ขนาดของกราฟ[curr] อัปเดต (เพิ่ม i ขึ้น 1) ทำ -
-
เพื่อนบ้าน :=กราฟ[curr, i, 0]
-
ถ้า cost[neighbour, dist]> cost[curr, dist - 1] + graph[curr, i, 1] แล้ว −
-
cost[neighbour, dist] :=cost[curr, dist - 1] + กราฟ[curr, i, 1]
-
แทรก Data(neighbour, dist, cost[neighbour, dist]) ลงใน q
-
-
-
-
กลับ -1
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; struct Data{ int node, dist, cost; Data(int a, int b, int c){ node = a; dist = b; cost = c; } }; struct Comparator{ bool operator() (Data a, Data b) { return !(a.cost < b.cost); } }; class Solution { public: vector<vector<int>> cost; int findCheapestPrice(int n, vector<vector<int>>& flights, int src, int dst, int K) { cost = vector<vector<int> >(n + 1, vector<int>(K + 10, INT_MAX)); vector<vector<int> > graph[n]; for (int i = 0; i < flights.size(); i++) { int u = flights[i][0]; int v = flights[i][1]; graph[u].push_back({ v, flights[i][2] }); } priority_queue<Data, vector<Data>, Comparator> q; q.push(Data(src, 0, 0)); cost[src][0] = 0; int ans = -1; while (!q.empty()) { Data temp = q.top(); int curr = temp.node; q.pop(); int dist = temp.dist; if (curr == dst) return temp.cost; dist++; if (dist > K + 1) continue; for (int i = 0; i < graph[curr].size(); i++) { int neighbour = graph[curr][i][0]; if (cost[neighbour][dist] > cost[curr][dist - 1] + graph[curr][i][1]) { cost[neighbour][dist] = cost[curr][dist - 1] + graph[curr][i][1]; q.push(Data(neighbour, dist, cost[neighbour][dist])); } } } return -1; } }; main(){ Solution ob; vector<vector<int>> v = {{0,1,100},{1,2,100},{0,2,500}}; cout << (ob.findCheapestPrice(3, v, 0, 2, 1)); }
อินพุต
3, {{0,1,100},{1,2,100},{0,2,500}}, 0, 2, 1
ผลลัพธ์
200