Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

주어진 모든 트리플렛에 대한 최단 비용 경로의 합을 찾는 C++ 프로그램

<시간/>

n개의 도시와 도시 사이에 m개의 도로가 있다고 가정합니다. m개의 도로는 도로가 {aource, destination, weight} 형식인 도로 배열로 제공됩니다. 이제 s, t, k가 도시인 삼중항(s, t, k)을 정의합니다. 이제 도시 s에서 도시 t까지 이동하는 데 필요한 최소 시간을 계산해야 합니다. s에서 t를 방문하려면 1에서 k 사이의 도시만 방문할 수 있습니다. 도시 t가 s에서 도달할 수 없으면 0을 반환합니다. 모든 삼중항(s, t, k)에 대한 최소 시간을 계산하고 그 합계를 출력해야 합니다.

따라서 입력이 n =4, m =2, edge ={{1, 2, 5}, {2, 3, 4}, {3, 4, 3}}인 경우 출력은 63이 됩니다.

단계

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

Define one 2D array dvec initialized with value infinity
for initialize i := 0, when i < n, update (increase i by 1), do:
   dvec[i, i] := 0
for initialize i := 0, when i < m, update (increase i by 1), do:
   a := first value of (edges[i])
   b := second value of (edges[i])
   c := third value of (edges[i])
   decrease a and b by 1
   dvec[a, b] := c
res := 0
for initialize k := 0, when k < n, update (increase k by 1), do:
   for initialize i := 0, when i < n, update (increase i by 1), do:
       for initialize j := 0, when j < n, update (increase j by 1), do:
       dvec[i, j] := minimum of (dvec[i, j] and dvec[i, k] + dvec[k, j])
       if dvec[i, j] is not equal to infinity, then:
          res := res + dvec[i, j]
print(res)

예시

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;

void solve(int n, int m, vector<tuple<int, int, int>> edges){
   vector<vector<int>> dvec(n, vector<int>(n, INF));
   for(int i = 0; i < n; i++)
      dvec[i][i] = 0;
   for(int i = 0; i < m; i++) {
      int a = get<0> (edges[i]);
      int b = get<1> (edges[i]);
      int c = get<2> (edges[i]);
      a--; b--;
      dvec[a][b] = c;
   }
   int res = 0;
   for(int k = 0; k < n; k++) {
      for(int i = 0; i < n; i++) {
         for(int j = 0; j < n; j++) {
            dvec[i][j] = min(dvec[i][j], dvec[i][k]+dvec[k][j]);
            if(dvec[i][j] != INF)
               res += dvec[i][j];
         }
      }
   }
   cout << res << endl;
}
int main() {
   int n = 4, m = 2;
   vector<tuple<int, int, int>> edges = {{1, 2, 5}, {2, 3, 4}, {3, 4, 3}};
   solve(n, m, edges);
   return 0;
}

입력

4, 2, {{1, 2, 5}, {2, 3, 4}, {3, 4, 3}}

출력

63