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

C++에서 모든 경로가 City Zero로 연결되도록 경로 재정렬

<시간/>

0에서 n-1까지 번호가 매겨진 n개의 다른 도시가 있고 n-1개의 도로가 있어 두 개의 다른 도시 사이를 여행하는 방법은 단 하나라고 가정합니다. 교통부가 도로가 너무 좁아서 한 방향으로 방향을 지정하기로 결정했다고 가정해 보겠습니다.

여기서 도로는 연결[i] =[a, b]인 연결로 표시됩니다. 이는 도시에서 b까지의 도로를 나타냅니다.

수도(도시 번호 0)에 큰 행사가 있고 많은 사람들이 이 도시로 여행을 가고 싶어하는 경우. 각 도시가 도시 0을 방문할 수 있도록 일부 도로에서 방향 재지정 작업을 수행해야 합니다. 변경된 모서리의 최소 수를 찾아야 합니다.

따라서 입력이 6과 같으면 연결 =[[0,1],[1,3],[2,3],[4,0],[4,5]],

C++에서 모든 경로가 City Zero로 연결되도록 경로 재정렬

각 노드가 대문자에 도달할 수 있도록 빨간색으로 표시된 가장자리의 방향을 변경해야 하므로 출력은 3이 됩니다.

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

  • N =5*10^4 + 5

    크기의 graph1, graph2 목록의 두 배열을 정의합니다.
  • 주요 방법에서 다음을 수행하십시오 -

  • 하나의 지도 정의

  • e의 각 요소에 대해 수행

    • 그래프1[it[0]]의 끝에 삽입[1]

    • 그래프2[it[1]]의 끝에 삽입[0]

  • 크기가 n인 배열 dist를 정의하고 N + 10으로 채웁니다.

  • ret :=0, in[0] :=0, dist[0] :=0

  • 하나의 대기열 정의 q

  • q에 0 삽입

  • 방문한 한 세트 정의

  • 방문에 0 삽입

  • 동안(q가 비어 있지 않음) -

    를 수행합니다.
    • node :=q의 첫 번째 요소

    • q에서 요소 삭제

    • ret :=ret + dist[노드]

    • graph2[node]의 각 요소에 대해 수행

      • 방문하지 않고 dist[it]> 0이면 -

        • dist[it] :=0

        • q에 삽입

        • 방문한 페이지에 삽입

    • graph1[node]의 각 요소에 대해 수행

      • 방문하지 않고 dist[it]> 1이면 -

        • dist[it] :=1

        • q에 삽입

        • 방문한 페이지에 삽입

  • 리턴 렛

예시

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

#include <bits/stdc++.h>
using namespace std;
const int N = 5e4 + 5;
class Solution {
public:
   vector<int> graph1[N];
   vector<int> graph2[N];
   int minReorder(int n, vector<vector<int> >& e){
      map<int, int> in;
      for (auto& it : e) {
         graph1[it[0]].push_back(it[1]);
         graph2[it[1]].push_back(it[0]);
      }
      vector<int> dist(n, N + 10);
      int ret = 0;
      in[0] = 0;
      dist[0] = 0;
      queue<int> q;
      q.push(0);
      set<int> visited;
      visited.insert(0);
      while (!q.empty()) {
         int node = q.front();
         q.pop();
         ret += dist[node];
         for (auto& it : graph2[node]) {
            if (!visited.count(it) && dist[it] > 0) {
               dist[it] = 0;
               q.push(it);
               visited.insert(it);
            }
         }
         for (auto& it : graph1[node]) {
            if (!visited.count(it) && dist[it] > 1) {
               dist[it] = 1;
               q.push(it);
               visited.insert(it);
            }
         }
      }
      return ret;
   }
};
main(){
   Solution ob;
   vector<vector<int>> v = {{0,1},{1,3},{2,3},{4,0},{4,5}};
   cout << (ob.minReorder(6,v));
}

입력

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

출력

3