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

C++에서 상대방을 잡기 위해 필요한 최소 걸음 수를 찾는 프로그램

<시간/>

[u, v] 형식의 트리 가장자리 목록이 있다고 가정합니다. 이는 u와 v 사이에 무방향 가장자리가 있음을 나타냅니다. 그리고 x와 y 값도 두 개 있습니다. 우리가 노드 x에 있고 상대가 노드 y에 있는 경우. 첫 번째 라운드에서는 우리가 이동하고 다음 라운드에서는 상대방이 이동하는 식으로 진행됩니다. 상대방은 라운드에서 움직이지 않도록 선택할 수 있습니다. 상대를 잡는 데 필요한 최소 라운드 수를 찾아야 합니다.

따라서 입력이 edge =[[0, 1], [0, 2], [1, 3], [1, 4]], x =0, y =3과 같으면 출력은 3이 됩니다. 처음과 같이 노드 0에서 1로 이동합니다. 그러면 상대방은 현재 노드 3에 머물고 우리는 노드 3으로 이동합니다.

C++에서 상대방을 잡기 위해 필요한 최소 걸음 수를 찾는 프로그램

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

  • N :=1^5 + 5

  • 크기가 N인 방문 배열을 정의하고 크기가 N인 다른 방문2 배열을 정의합니다. −1

  • N 노드에 대한 인접 목록 그래프 생성

  • 가장자리 목록의 각 가장자리에 대해

    • 그래프 끝에[v] 삽입[it[u]]

    • 그래프 끝에[u] 삽입[it[v]]

  • 하나의 대기열 정의 w

  • u를 q에 삽입

  • 방문[u] :=0

  • q가 비어 있지 않은 동안 수행 -

    • node :=q의 첫 번째 요소

    • q에서 요소 삭제

    • 각 노드에 대해 그래프[노드]

      • 방문[it]이 −1과 같으면 −

        • 방문[it] :=방문[노드] + 1

        • q에 삽입

  • v를 q에 삽입

  • 렛 :=0

  • 방문2[v] :=0

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

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

    • q에서 요소 삭제

    • ret :=ret의 최대값 및 2 * (방문한[노드])

    • 각 노드에 대해 그래프[노드]

      • 방문2[it]이 -1 및 방문2[노드] + 2 <방문[it]과 같으면 -

        • 방문2[it] :=방문2[노드] + 1

        • q에 삽입

  • 리턴 렛

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

예시

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int visited[N];
int visited2[N];
vector<int> graph[N];
class Solution {
   public:
   int solve(vector<vector<int>>& edges, int u, int v) {
      memset(visited, −1, sizeof visited);
      memset(visited2, −1, sizeof visited2);
      for (int i = 0; i < N; i++)
      graph[i].clear();
      for (auto& it : edges) {
         graph[it[0]].push_back(it[1]);
         graph[it[1]].push_back(it[0]);
      }
      queue<int> q;
      q.push(u);
      visited[u] = 0;
      while (!q.empty()) {
         int node = q.front();
         q.pop();
         for (auto& it : graph[node]) {
            if (visited[it] == −1) {
               visited[it] = visited[node] + 1;
               q.push(it);
            }
         }
      }
      q.push(v);
      int ret = 0;
      visited2[v] = 0;
      while (!q.empty()) {
         int node = q.front();
         q.pop();
         ret = max(ret, 2 * (visited[node]) − 1);
         for (auto& it : graph[node]) {
            if (visited2[it] == −1 && visited2[node] + 2 <
            visited[it]) {
               visited2[it] = visited2[node] + 1;
               q.push(it);
            }
         }
      }
      return ret;
   }
};
int solve(vector<vector<int>>& edges, int u, int v) {
   return (new Solution())−>solve(edges, u, v);
}
int main(){
   vector<vector<int>> edge = {{0, 1},{0, 2},{1, 3},{1, 4}};
   int x = 0, y = 3;
   cout << solve(edge, x, y);
}

입력

[
   [0, 1],
   [0, 2],
   [1, 3],
   [1, 4]
], 0, 3

출력

3