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

C++에서 나무의 모든 사과를 수집하는 최소 시간

<시간/>

n개의 꼭짓점으로 구성된 무향 나무가 있고 꼭짓점에 사과가 몇 개 있는 0에서 n-1까지 번호가 매겨져 있다고 가정합니다. 우리는 나무의 한쪽 가장자리를 걷는 데 1초를 보냅니다. 정점 0에서 시작하여 이 정점으로 되돌아오는 트리의 모든 사과를 수집하기 위해 소비해야 하는 최소 시간(초)을 찾아야 합니다.

여기에서 무방향 트리의 에지는 배열 에지에 주어집니다. 여기서 edge[i] =[from_i, to_i] 이것은 정점 from_i와 to_i를 연결하는 에지가 존재함을 의미합니다. 또한, 사과가 있는 또 다른 배열이 있습니다. 여기서 hasApple[i] =true는 정점 i에 사과가 있음을 의미하고, 그렇지 않으면 사과가 없습니다.

따라서 입력이 n =7이고 edge =[[0,1],[0,2],[1,4],[1,5],[2,3],[2,6]]인 경우 , 그리고 사과 =[거짓, 거짓, 참, 거짓, 참, 참, 거짓]이 있으면 출력은 8이 됩니다.

C++에서 나무의 모든 사과를 수집하는 최소 시간

위의 이미지에서 빨간색 정점에 사과가 있는 나무를 볼 수 있습니다. 모든 사과를 모으는 최적의 경로는 녹색 화살표로 표시됩니다.

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

  • 방문한 한 세트 정의

  • dfs() 함수를 정의하면 노드, par, 배열 a, 배열 그래프[],

    가 사용됩니다.
  • 온도 :=0

  • 그래프[노드]의 각 요소 x에 대해 -

    • x가 par와 같으면 -

      • 다음 부분은 무시하고 다음 반복으로 건너뜁니다.

    • 임시 :=임시 + dfs(x, 노드, a, 그래프)

  • ret :=ret + temp * 2

  • a[node] + temp> 0이면 true를 반환하고, 그렇지 않으면 0

    을 반환합니다.
  • 주요 방법에서 다음을 수행하십시오 -

  • ret :=0

  • 그래프라고 하는 n개 목록의 배열을 정의합니다.

  • initialize i :=0의 경우 i

    • 그래프 끝에 e[i, 1] 삽입[e[i, 0]]

    • 그래프 끝에 e[i, 0] 삽입[e[i, 1]]

  • dfs(0, -1, a, 그래프)

  • 리턴 렛

예시

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

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6;
class Solution {
public:
   set<int> visited;
   int ret;
   int dfs(int node, int par, vector<bool>& a, vector<int> graph[]){
      int temp = 0;
      for (int x : graph[node]) {
         if (x == par)
            continue;
         temp += dfs(x, node, a, graph);
      }
      ret += temp * 2;
      return a[node] + temp > 0;
   }
   int minTime(int n, vector<vector<int> >& e, vector<bool>& a){
      ret = 0;
      vector<int> graph[n];
      for (int i = 0; i < e.size(); i++) {
         graph[e[i][0]].push_back(e[i][1]);
         graph[e[i][1]].push_back(e[i][0]);
      }
      dfs(0, -1, a, graph);
      return ret;
   }
};
main(){
   Solution ob;
   vector<vector<int>> v = {{0,1},{0,2},{1,4},{1,5},{2,3},{2,6}};
   vector<bool> v1 = {false,false,true,false,true,true,false};
   cout << (ob.minTime(7,v, v1));
}

입력

7, {{0,1},{0,2},{1,4},{1,5},{2,3},{2,6}},
{false,false,true,false,true,true,false}

출력

8