Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรม C++ เพื่อดูว่าสามารถเดินทางไปกลับจากเมืองใดเมืองหนึ่งได้หรือไม่


สมมติว่ามี n เมืองและถนน m เชื่อมต่อกัน ถนนแต่ละเส้นเป็นทางเดียว และต้องใช้เวลาระยะหนึ่งในการเดินทางจากเมืองต้นทางไปยังเมืองปลายทาง ข้อมูลของถนนจะแสดงในถนนแถวเรียงซึ่งแต่ละองค์ประกอบอยู่ในรูปแบบ (ต้นทาง ปลายทาง เวลา) ตอนนี้มีคนเดินทางจากเมืองหนึ่งไปยังอีกเมืองหนึ่งและการเดินทางจะต้องไป-กลับ การเดินทางสามารถเรียกได้ว่าไป - กลับเมื่อบุคคลนั้นเริ่มจากเมืองใดเมืองหนึ่ง ผ่านถนนหนึ่งเส้นขึ้นไป และสิ้นสุดการเดินทางในเมืองเดียวกัน ดังนั้น สำหรับแต่ละเมือง เราต้องพิจารณาว่าสามารถเดินทางไปกลับจากเมืองนั้น ๆ ได้หรือไม่ หากเป็นไปได้ ให้พิมพ์เวลาที่ใช้ในการเดินทางไปกลับหรือมิฉะนั้นให้พิมพ์ -1

ดังนั้น หากอินพุตเป็น n =4, m =4, ถนน ={{1, 2, 5}, {2, 3, 8}, {3, 4, 7}, {4, 1, 6}} จากนั้นผลลัพธ์จะเป็น:26 26 26 26 จากแต่ละเมืองจะต้องใช้เวลา 26 เพื่อเดินทางไปกลับ

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

Define one 2D array graph(n) of pairs
for initialize i := 0, when i < m, update (increase i by 1), do:
   x := first value of roads[i]
   y := second value of roads[i]
   z := third value of roads[i]
   decrease x and y by 1
   insert pair (y, z) at the end of graph[x]
for initialize i := 0, when i < n, update (increase i by 1), do:
   q := a new priority queue
   Define an array dst
   insert pair (0, i) at the top of q
   while size of q is non-zero, do:
      pair p := top value of q
      delete the top element from q
      dt := first value of p
      curr := second value of p
      if dst[curr] is same as 0, then:
         dst[curr] := dt
         Come out from the loop
      if dst[curr] is not equal to -1, then:
         Ignore following part, skip to the next iteration
      dst[curr] := dt
      for element next in graph[curr], do:
         tp := first value of next
         cst := second value of next
         insert pair(dt + cst, tp) at the top of q
   if dst[i] is same as 0, then:
      dst[i] := -1
   print(dst[i])

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
const int modval = (int) 1e9 + 7;
#define N 100
void solve(int n, int m, vector<tuple<int, int, int>> roads ) {
   vector<vector<pair<int, int>>> graph(n);
   for(int i = 0; i < m; i++) {
      int x, y, z;
      tie(x, y, z) = roads[i];
      x--; y--;
      graph[x].emplace_back(y, z);
   }
   for(int i = 0; i < n; i++) {
      priority_queue<pair<int, int>> q;
      vector<int> dst(n, -1);
      q.emplace(0, i);
      while(q.size()){
         pair<int, int> p = q.top();
         q.pop();
         int curr, dt;
         tie(dt, curr) = p;
         if(dst[curr] == 0) {
            dst[curr] = dt;
            break;
         }
         if(dst[curr] != -1)
            continue;
         dst[curr] = dt;
         for(auto next : graph[curr]){
            int tp, cst;
            tie(tp, cst) = next;
            q.emplace(dt + cst, tp);
         }
      }
      if(dst[i] == 0)
      dst[i] = -1;
      cout<< dst[i]<< endl;
   }
}
int main() {
   int n = 4, m = 4;
   vector<tuple<int, int, int>> roads = {{1, 2, 5}, {2, 3, 8}, {3, 4, 7}, {4, 1, 6}};
   solve(n, m, roads);
   return 0;
}

อินพุต

4, 4, {{1, 2, 5}, {2, 3, 8}, {3, 4, 7}, {4, 1, 6}}

ผลลัพธ์

26
26
26
26