dev_beomgeun
꾸준하게 차근차근
dev_beomgeun
전체 방문자
오늘
어제
  • 분류 전체보기 (170)
    • 전공 (0)
      • 운영체제 (0)
      • 알고리즘 (0)
      • 자료구조 (0)
      • 데이터베이스 (0)
      • 네트워크 (0)
    • 개발 공부 (32)
      • 웹 (6)
      • 리눅스 (4)
      • 머신러닝 (1)
      • 스프링 (17)
      • Git (2)
      • AWS (2)
    • 개발 도서, 강의 (3)
      • 스프링 입문을 위한 자바 객체지향의 원리와 이해 (0)
      • 모든 개발자를 위한 HTTP 웹 기본 지식(김영한.. (2)
      • 스프링 부트와 AWS로 혼자 구현하는 웹서비스 (1)
    • 문제 풀이 (118)
      • 백준 알고리즘 (72)
      • 프로그래머스 알고리즘, SQL (38)
      • Hackerrank SQL (8)
    • 프로젝트 기록 (4)
      • 캡스톤 종합설계 (4)
      • 반려하루 프로젝트 (0)
    • 활동 기록 (12)
      • 네이버 부스트캠프 (7)
      • 취준 & 코테 (4)
      • 소프트웨어 마에스트로 13기 (1)
    • 이것저것 (1)

블로그 메뉴

  • 홈
  • 깃허브
  • 링크드인
  • 방명록

공지사항

인기 글

태그

  • 백준 DP
  • 서블릿
  • 반성
  • 백준
  • Baekjoon
  • 네이버 부스트캠프
  • 부스트캠프
  • BFS
  • dp
  • 일기
  • 스프링
  • AI Tech
  • Hackerrank
  • 프로그래머스
  • 기록
  • 프로그래머스 SQL
  • HackerRank mysql
  • c++
  • 그래프탐색
  • 회고

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
dev_beomgeun

꾸준하게 차근차근

문제 풀이/백준 알고리즘

[baekjoon 11725] 트리의 부모 찾기- 트리, 그래프, BFS, DFS (C++)

2021. 2. 5. 14:41
728x90

www.acmicpc.net/problem/11725

 

11725번: 트리의 부모 찾기

루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오.

www.acmicpc.net

루트는 1로 고정되어있고, 각 노드들의 부모를 출력하면 되는 문제이다.

 

일단 벡터를 통해 양 노드의 값을 저장해주고, DFS탐색을 노드 1부터 해준다.

 

트리의 특성상 리프 노드를 제외하고 연결되어 있으므로 연결된 노드를 통해 탐색해주면서, 부모를 저장해준다.

현재 x노드를 방문한 상태에서 x와 연결된 y가 아직 방문되지 않았다는 것은 y는 x의 자식 노드라는 의미이다.

 

방문하지 않았다면 DFS(연결된 다음 노드)를 진행해주면서 parent [연결된 다음 노드] = 현재 노드를 해주면 된다.

 

ex) 예제 입력이

7

1 6

6 3

3 5

4 1

2 4

4 7

이면

vector에 저장은 밑의 표처럼 저장이 되고(연결 정보를 표시)

1 2 3 4 5 6 7
6 4 6 1 3 1 4
4   5 2   3  
      7      

부모 테이블은 밑의 표처럼 구성이 된다.

1 2 3 4 5 6 7
루트 4 6 1 3 1 4

vector에 입력받은 순서대로 재귀를 진행해보면 (첫 번째 표를 따라가면서 읽으면 된다)

루트와 연결된 노드부터 루트의 자식으로 계산하면서 진행해준다.

1. 루트노드인 1부터 DFS(1) -> DFS(6) 방문하면서 parent[6] = 1

2. DFS(6) -> DFS(1) 이미 방문 -> DFS(3) 방문하면서 parent[3] = 6

3. DFS(3) -> DFS(6) 이미 방문 -> DFS(5) 방문하면서 parent[5] = 3

4. DFS(5) -> DFS(3) 이미 방문 -> 2, 3, 4 DFS는 종료 -> 다시 1번으로

 

5. DFS(1) -> DFS(4) 방문하면서 parent[4] = 1

6. DFS(4) -> DFS(1) 이미 방문 -> DFS(2) 방문하면서 parent[2] = 4

7. DFS(2) -> DFS(4) 이미 방문 -> 다시 6번으로

 

8. DFS(4) -> DFS(2) 이미 방문 -> DFS(7) 방문하면서 parent[7] = 4

9. DFS(7) -> DFS(4) 이미 방문 -> 나머지 DFS 재귀 종료되면서 탐색 종료

#include <iostream>
#include <vector>

using namespace std;

int n, from, to, parent[100001], check[100001];
vector<int> v[100001];

void DFS(int start) {
	check[start] = true;
	for (int i = 0; i < v[start].size(); i++) {
		int next = v[start][i];
		if (!check[next]) {
			parent[next] = start;
			DFS(next);
		}
	}
}


int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> n;
	for (int i = 1; i < n; i++) {
		cin >> from >> to;
		v[from].push_back(to);
		v[to].push_back(from);
	}

	DFS(1);

	for (int i = 2; i <= n; i++) {
		cout << parent[i] << "\n";
	}
}
728x90
저작자표시 비영리 변경금지 (새창열림)

'문제 풀이 > 백준 알고리즘' 카테고리의 다른 글

[baekjoon 2146] 다리 만들기 (그래프, BFS) (C++)  (0) 2021.02.08
[baekjoon 2110] 공유기 설치 (이진탐색) (C++)  (0) 2021.02.07
[baekjoon 2011] 암호코드- DP(동적 프로그래밍) (C++)  (0) 2021.02.03
[baekjoon 2225] 합분해- DP(동적 프로그래밍) (C++)  (0) 2021.02.02
[baekjoon 11052] 카드 구매하기- DP(동적 프로그래밍) (C++)  (0) 2021.01.28
    '문제 풀이/백준 알고리즘' 카테고리의 다른 글
    • [baekjoon 2146] 다리 만들기 (그래프, BFS) (C++)
    • [baekjoon 2110] 공유기 설치 (이진탐색) (C++)
    • [baekjoon 2011] 암호코드- DP(동적 프로그래밍) (C++)
    • [baekjoon 2225] 합분해- DP(동적 프로그래밍) (C++)
    dev_beomgeun
    dev_beomgeun
    백엔드 개발을 하며 얻은 지식과 경험을 공유합니다. 현재 카카오페이에서 백엔드 엔지니어로 일하고 있습니다.

    티스토리툴바