뿌리를 내린 나무가 있다고 가정해 봅시다. 이것은 다른 모든 노드가 이 노드의 자손인 정확히 하나의 노드(루트)가 있고 모든 노드는 루트 노드를 제외하고 정확히 하나의 부모를 갖는 방향 그래프입니다. 루트에는 부모가 없습니다.
주어진 입력에서 하나의 추가 방향 모서리가 추가된 N 노드(모든 값이 고유함)가 있는 루트 트리로 시작하는 방향 그래프. 추가된 가장자리는 1에서 N까지 선택된 두 개의 서로 다른 정점을 가지며 이미 존재하는 가장자리가 아닙니다.
그래프는 에지의 2D 배열입니다. 모서리의 각 요소는 노드 u와 v를 연결하는 방향 모서리를 나타내는 [u, v]와 같은 쌍입니다. 여기서 u는 자식 v의 부모입니다.
결과 그래프가 N 노드의 루트 트리가 되도록 제거할 수 있는 간선을 찾아야 합니다. 여러 답변이 있을 수 있으므로 주어진 2D 배열에서 마지막에 발생한 답변을 반환해야 합니다.
따라서 입력이 다음과 같으면 -

출력은 [2,3]
입니다.이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- getParent() 함수를 정의하면 노드, 배열 부모가 사용됩니다.
- 부모[노드]가 -1과 같으면 -
- 반환 노드
- 상위[노드] 반환 =getParent(상위[노드], 상위)
- 메인 방법에서 다음을 수행하십시오. -
- n :=가장자리 크기
- 크기가 n + 5인 배열 부모를 정의하고 -1로 채웁니다.
- 크기가 n + 5인 배열 ds를 정의하고 -1로 채웁니다.
- 마지막 :=-1, 두 번째 :=- 1, 첫 번째 :=- 1
- 초기화 i의 경우:=0, i
- u :=가장자리[i, 0], v :=가장자리[i, 1]
- 부모[v]가 -1과 같지 않으면 -
- 첫 번째 :=부모[v]
- 초 :=나
- 다음 부분은 무시하고 다음 반복으로 건너뜁니다.
- 부모[v] :=나, 부모U :=getParent(u, ds), parentV :=getParent(v, ds)
- parentU가 parentV와 같으면 -
- 마지막 :=나
- 그렇지 않으면,
- ds[parentV] :=parentU
- 리턴 에지[초]
- 가장자리 반환[마지막]
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
cout << "[";
for(int i = 0; i<v.size(); i++){
cout << v[i] << ", ";
}
cout << "]"<<endl;
}
class Solution {
public:
int getParent(int node, vector <int>& parent){
if(parent[node] == -1)return node;
return parent[node] = getParent(parent[node], parent);
}
vector<int> findRedundantDirectedConnection(vector<vector<int>>& edges) {
int n = edges.size();
vector <int> parent(n + 5, -1);
vector <int> ds(n + 5, -1);
int last = -1, second = -1, first = -1;
int u, v;
int parentU, parentV;
for(int i = 0; i < n; i++){
u = edges[i][0];
v = edges[i][1];
if(parent[v] != -1){
first = parent[v];
second = i;
continue;
}
parent[v] = i;
parentU = getParent(u, ds);
parentV = getParent(v, ds);
if(parentU == parentV){
last = i;
}else ds[parentV] = parentU;
}
if(last == -1)return edges[second];
if(second == -1)return edges[last];
return edges[first];
}
};
main(){
Solution ob;
vector<vector<int>> v = {{1,2},{1,3},{2,3}};
print_vector(ob.findRedundantDirectedConnection(v));
} 입력
{{1,2},{1,3},{2,3}} 출력
[2, 3, ]