어떻게 노드와 모서리 집합에서 얻을 수있는 루트와 트리를 얻을 수 있습니까? (나는 연결 매트릭스로 작업하고 있는데, 각 에지에는 가중치가 있습니다 : 그래프 [i] [j], 부정적인 가장자리 없음). 나중에 DFS를 수행하고 해당 트리에서 LCA를 찾아야하므로 최적화에 도움이됩니다.트리 루트 찾기
트리 루트 찾기
답변
그래프에서 DFS 검색을하면 나무가 생깁니다 (물론 그래프가 연결된 것으로 가정).
당신은 그것을 반복 할 수 있고 각 노드에서 가능한 루트로 시작할 수 있습니다. 결국이 방법으로 스패닝 트리를 얻을 수 있습니다. 복잡성은 O (V^2 + VE)
EDIT :이 될 것입니다. 왜냐하면 임의의 유한 그래프의 경우 루트 양식 노드 a가 노드 b이면 a에서 b까지의 경로가 있기 때문입니다 트리 DFS가 만듭니다. 그래서 스패닝 트리가 있다고 가정하면 루트 V가 각 v에 도달 할 수 있습니다. 루트로 선택한 r을 반복 할 때 r에서 V의 각 v까지의 경로가 있기 때문에 스패닝 트리에서 r부터 r까지의 경로 여야합니다.
트리에서 하나의 노드를 선택하고 가장자리의 방향에 대해 위로 이동하십시오. 조상이없는 노드를 발견하면 루트가 있습니다.
이렇게 자주해야하는 경우 각 노드의 부모 노드를 기억하십시오.
OP의 그래프가 트리인지 확신 할 수 없지만 그래프가 있다고 생각합니다. 스패닝 트리를 찾아야합니다. 예를 들어, 클릭에서 알고리즘은 끝나지 않을 것이고 (방문한 노드 집합을 유지하면 실패 할 것입니다.), 거기에는 스패닝 트리가 있습니다. – amit
질문은 "나무 뿌리 발견"에 관한 것입니다. 그래서 그것이 제가 대답 한 것입니다. OP가 나무를 가지고 있지 않다면 분명히 그가 무엇을 가지고 있고 정확히 무엇을 찾고 싶은지를 명시해야합니다. – svick
저를위한 솔루션은 다음과 같습니다 : 대칭 연결 - 행렬 만들기, 모든 노드 (예 : 노드 0)에 대해 DFS를 수행하면 모든 것이 올바르게 작동합니다. – sashab
나는 당신의 행렬은 directed graph G(V,E)를 들어, (즉 M[i][j]
이 j
이 i
의 자식임을 알려줍니다) 자식 관계를 나타낸다는 것을 가정한다.
당신은 2 개 개의 다른 전략이 있습니다
- 사용 비트 벡터, 당신의 행렬의 각 셀을 통과, 셀의 무게는) null가 아닌 경우, 벡터의 자식 인덱스 표시를 : 루트가있다 (당신의 매트릭스는 열이 처음 인 경우, 또는 행) 정점은
두 번째 솔루션은 밀도 행렬에 대한 더 나은, 그 세포 모두 널 (NO 조상)이다
첫 번째 셀은 모든 셀을 거쳐야하기 때문에 스파 스 매트릭스에 더 적합합니다. 실행 시간은 O (E)입니다. 당신은 또한이 알고리즘으로 모든 뿌리를 얻습니다.
그래프에 단 하나의 루트 만있는 것이 확실한 경우 다른 대답에서 설명한대로 가장자리를 따라 걷는 방법을 사용할 수 있습니다.
코드 작성이 훨씬 쉬운 계산적으로 느린 SLOWER 버전입니다. 작은 그래프의 경우에는 괜찮습니다.
학위가 0 인 노드를 찾습니다!
모든 노드도 O (n)을 계산해야하지만 설정에 따라 코드 작성이 훨씬 쉬우 며 오류가 발생하지 않습니다.
- 1. DataGridColumn의 루트 요소 찾기
- 2. 다중 루트 트리 구조
- 3. ExtJS로 변경 트리 루트
- 4. 자바에서 동의어와 루트 찾기
- 5. 시작점이없는 루트 찾기
- 6. 시컨트 루트 찾기 문제 C++
- 7. 루트 디렉토리의 모든 폴더 찾기
- 8. CakePHP 트리에서 서브 트리 찾기
- 9. 대상 비용으로 스패닝 트리 찾기
- 10. 자동 참조 외래 키가있는 트리 구조의 루트
- 11. 프로세스 트리, 프로세스가 루트 프로세스인지 찾는 방법?
- 12. (Flex 4), 루트 노드에서 트리 복사본 만들기
- 13. jquery selector - 루트 노드의 자식 찾기
- 14. C++ 간격 트리 알고리즘 구현 찾기
- 15. Java 프로그램의 실제 런타임 호출 트리 찾기
- 16. C#에서 트리 노드 찾기 및 바꾸기
- 17. Hibernate : 루트 객체를 가진 루트 콜렉션
- 18. WPF - 바운드 트리 뷰가 루트 항목을 업데이트하지 않습니다.
- 19. 사용자 (그룹) - 항목 (폴더), 트리 구조가있는 다중 루트 데이터베이스
- 20. 정확한 노드 찾기 C#
- 21. 루트
- 22. 루트
- 23. 도장 트리 이벤트는
- 24. 브렌트 루트 찾기 알고리즘의 일반적인 구현에서 "e"변수는 무엇입니까?
- 25. 접미사 트리
- 26. 오라클 : 트리 트리 업데이트
- 27. 트리 뷰의 트리 비교
- 28. 트리 구조에서 T 유형의 모든 객체 찾기 C#
- 29. dijit 트리 : 새 데이터 저장소 항목과 연결된 treenode 찾기
- 30. C++ : 스레드 기반 병렬 kd 트리 라이브러리 찾기
나는 이것이 방향성이있는 그래프인가? 그렇지 않으면 트리의 노드가 유효한 루트가됩니다. – hammar
예, 그래프가 방향을 바꿉니다. 방향 (?)을 변경하는 것이 작업입니다. – sashab