สมมติว่าเรามีกราฟแบบไม่มีทิศทางที่ถ่วงน้ำหนักซึ่งมีโหนดต่างกัน N โหนดและขอบ M โหนดบางรายการเป็นโหนดที่ดี เราต้องหาระยะทางที่สั้นที่สุดระหว่างโหนดที่ดีสองโหนดที่ต่างกัน ในแผนภาพที่กำหนด สีเหลืองในกราฟต่อไปนี้ถือเป็นโหนดที่ดี
ดังนั้นหากอินพุตเป็นแบบ
ผลลัพธ์จะเป็น 11 เนื่องจากคู่ของโหนดที่ดีและระยะห่างระหว่างพวกเขาคือ:(1 ถึง 3) ระยะทางคือ 11, (3 ถึง 5) ระยะทางคือ 13, (1 ถึง 5) ระยะทางคือ 24, ออก โดยที่ 11 เป็นขั้นต่ำ
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
ไม่มี :=100005
-
MAX_VAL :=99999999
-
สร้างคิวลำดับความสำคัญหนึ่งคิว q
-
ผลลัพธ์ :=MAX_VAL
-
สำหรับการเริ่มต้น i :=1 เมื่อฉัน <=n อัปเดต (เพิ่ม i ขึ้น 1) ทำ -
-
ถ้า good_verts[i] เป็นเท็จ −
-
ละเว้นส่วนต่อไปนี้ ข้ามไปยังการทำซ้ำถัดไป
-
-
สำหรับการเริ่มต้น j :=1 เมื่อ j <=n อัปเดต (เพิ่ม j โดย 1) ทำ -
-
dist[j] :=MAX_VAL
-
กับ[j] :=0
-
-
dist[i] :=0
-
ในขณะที่ (ไม่ใช่ q ว่างเปล่า) ทำ -
-
ลบองค์ประกอบออกจาก q
-
-
แทรก { 0, i } ลงใน q
-
ดี :=0
-
ในขณะที่ (ไม่ใช่ q ว่างเปล่า) ทำ -
-
v :=องค์ประกอบด้านบนของ q
-
ลบองค์ประกอบออกจาก q
-
ถ้า vis[v] เป็นจริง ดังนั้น −
-
ละเว้นส่วนต่อไปนี้ ข้ามไปยังการทำซ้ำถัดไป
-
-
กับ[v] :=1
-
ดี :=ดี + (1 เมื่อ good_verts[v] เป็นจริง มิฉะนั้น 0)
-
ถ้า dist[v]> ผลลัพธ์ แล้ว −
-
ออกจากวง
-
-
ถ้าดีเท่ากับ 2 และ good_verts[v] แล้ว −
-
ผลลัพธ์ :=ขั้นต่ำของผลลัพธ์และ dist[v]
-
ออกจากวง
-
-
สำหรับการเริ่มต้น j :=0 เมื่อ j <ขนาดของกราฟ[v] อัปเดต (เพิ่ม j ทีละ 1) ให้ทำ -
-
ถึง :=graph[v, j].first
-
น้ำหนัก :=กราฟ[v, j].วินาที
-
ถ้า dist[v] + น้ำหนัก
-
dist[to] :=dist[v] + น้ำหนัก
-
แทรก { dist[to], ถึง } ลงใน q
-
-
-
-
-
ส่งคืนผลลัพธ์
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; #define N 100005 #define MAX_VAL 99999999 void insert_edge(vector<pair<int, int> > graph[], int x, int y, int weight) { graph[x].push_back({ y, weight }); graph[y].push_back({ x, weight }); } int get_min_dist(vector<pair<int, int> > graph[], int n, int dist[], int vis[], int good_verts[], int k) { priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int>>> q; int result = MAX_VAL; for (int i = 1; i <= n; i++) { if (!good_verts[i]) continue; for (int j = 1; j <= n; j++) { dist[j] = MAX_VAL; vis[j] = 0; } dist[i] = 0; while (!q.empty()) q.pop(); q.push({ 0, i }); int good = 0; while (!q.empty()) { int v = q.top().second; q.pop(); if (vis[v]) continue; vis[v] = 1; good += good_verts[v]; if (dist[v] > result) break; if (good == 2 and good_verts[v]) { result = min(result, dist[v]); break; } for (int j = 0; j < graph[v].size(); j++) { int to = graph[v][j].first; int weight = graph[v][j].second; if (dist[v] + weight < dist[to]) { dist[to] = dist[v] + weight; q.push({ dist[to], to }); } } } } return result; } int main() { int n = 5, m = 5; vector<pair<int, int> > graph[N]; insert_edge(graph, 1, 2, 3); insert_edge(graph, 1, 2, 3); insert_edge(graph, 2, 3, 4); insert_edge(graph, 3, 4, 1); insert_edge(graph, 4, 5, 8); int k = 3; int good_verts[N], vis[N], dist[N]; good_verts[1] = good_verts[3] = good_verts[5] = 1; cout << get_min_dist(graph, n, dist, vis, good_verts, k); }
อินพุต
n = 5, m = 5 insert_edge(graph, 1, 2, 3); insert_edge(graph, 1, 2, 3); insert_edge(graph, 2, 3, 4); insert_edge(graph, 3, 4, 1); insert_edge(graph, 4, 5, 8); k = 3 good_verts[1] = good_verts[3] = good_verts[5] = 1;
ผลลัพธ์
7