-
[백준/BOJ] 16964번 DFS 스페셜 저지 (C++)알고리즘 문제풀이/백준 2021. 1. 15. 16:43
16964번: DFS 스페셜 저지
첫째 줄에 정점의 수 N(2 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N-1개의 줄에는 트리의 간선 정보가 주어진다. 마지막 줄에는 DFS 방문 순서가 주어진다. DFS 방문 순서는 항상 N개의 정수로 이루
www.acmicpc.net
DFS 유형의 문제입니다. (다시 풀기)
입력값으로 받는 DFS의 진행 순서에 맞게끔 각각의 노드에 인접한 노드들을 내림차순으로 정렬하는 것이 포인트였던 문제였습니다.
#include <iostream> #include <vector> #include <algorithm> using namespace std; vector<int> graph[100001]; bool visit[100001]; vector<int> order(100001), answer; int cmp(int a, int b) { return order[a] < order[b]; } void DFS(int node) { answer.push_back(node); for(int i = 0; i < graph[node].size(); i++) { int next = graph[node][i]; if(visit[next]) continue; visit[next] = true; DFS(next); } } int main(void) { ios_base::sync_with_stdio(false); cin.tie(0); int n; cin >> n; vector<int> input(n); for(int i = 0; i < n - 1; i++) { int v1, v2; cin >> v1 >> v2; graph[v1].push_back(v2); graph[v2].push_back(v1); } for(int i = 0; i < n; i++) { cin >> input[i]; order[input[i]] = i + 1; // 그래프 정렬을 위해 각 노드의 DFS 진행 순서 저장 } int start = input[0]; if(start != 1) { cout << "0"; return 0; } // 각 노드에 인접한 노드를 DFS 진행 순서에 맞게 내림차순 정렬 for(int i = 1; i <= n; i++) { sort(graph[i].begin(), graph[i].end(), cmp); } visit[start] = true; DFS(start); if(answer == input) cout << "1"; else cout << "0"; }
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준/BOJ] 11060번 점프점프 (C++) (0) 2021.01.19 [백준/BOJ] 11048번 이동하기 (C++) (0) 2021.01.18 [백준/BOJ] 7569번 토마토 (C++) (0) 2021.01.14 [백준/BOJ] 1012번 유기농 배추 (C++) (0) 2021.01.14 [백준/BOJ] 16940번 BFS 스페셜 저지 (0) 2021.01.14