728x90
모든 트리문제를 트리구조로 만들어서 풀 필요는 없다.
코드의 2~4줄의 주석처럼 코딩을 했더라면 아마 100줄이상은 분량이 나왔을거다.
문제의 핵심은 각 연결된 두 정점이 있을 때, 둘 중 무엇이 start node고 무엇이 end node인지 모른다는 것이다.
모를 때는 pair로 접근하는 것은 어려운것 같고,
양방향으로 탐색을 해야하기 때문에 벡터에다가 node1 - node2 , node2 - node1 두 가지 모두를 집어넣으면 된다는 점이다.
이렇게 벡터로 트리를 구현한 다음, dfs로 방문 여부를 판단하면서 부모 노드를 기록하면서 진행하면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
////11725번문제
//1. 페어를 각각 만든다
//2. 그걸 벡터에 일단 다 저장해
//3. 트리구조로 만든다음에, 탐색하며 부모찾기? --> 너무복잡. 이렇게 안해도 됨.
#include <iostream>
#include <vector>
using namespace std;
int N;
const int MAX=100001;
bool visited[MAX];
int parent[MAX];
vector<int> v[MAX];
void dfs(int idx){
visited[idx] = true;
for(int i=0; i<v[idx].size(); i++){
int next_idx = v[idx][i];
if(!visited[next_idx]){
parent[next_idx]=idx;
dfs(next_idx);
}
}
}
int main(void){
cin>>N;
for(int i=0; i<N-1; i++){
int n1,n2;
cin>>n1>>n2;
v[n1].push_back(n2);
v[n2].push_back(n1);
}
dfs(1);
for(int i=2;i<=N; i++)
cout<<parent[i]<<'\n';
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
어렵게 생각하지 말자
'알고리즘 > 백준' 카테고리의 다른 글
백준 1931 회의실 배정-greedy algorithm(C++) (0) | 2020.01.15 |
---|---|
백준 10610 30 (greedy) - C++ (0) | 2020.01.14 |
백준 1991 트리순회 - 이진트리와 재귀함수 (C++) (0) | 2020.01.12 |
백준 2884 알람시계 (입출력)- C++ (0) | 2020.01.12 |
백준 2146 다리만들기 - bfs 2번 활용 (C++) (0) | 2020.01.12 |