-
백준 16940번 BFS 스페셜 저지PS 2020. 4. 8. 20:56
https://www.acmicpc.net/problem/16940
16940번: BFS 스페셜 저지
올바른 순서는 1, 2, 3, 4와 1, 3, 2, 4가 있다.
www.acmicpc.net
<접근방법>
그래프가 주어지고 bfs를 돌렸을 때, 나올 수 있는 방문 순서인가를 묻는 문제입니다.
방문 깊이?뿐만 아니라 큐에 들어간 순서를 고려해야 합니다.
A-a
B-b
A, B가 동일 depth이고 a,b가 동일 depth일 때, A가 먼저 큐에 들어갔으면 A, B, a, b가 방문 순서가 되겠지요.
q.front()의 결과로 나온 노드의 자식노드가 전부 나왔는가를 확인합니다.
이의 결과로 두 가지가 있습니다.
1. 만약 자식노드가 전부 나왔다.
이 경우는 자식노드를 큐에 넣어주는 순서를 입력받은 순서대로 하여 넣어줍니다.
2. 자식노드가 전부 나오지 않았다.
이 경우는 bfs에서 나올 수 없는 케이스므로 bfs를 종료해줍니다.
<느낀 점>
<코드>
#include <iostream> #include <algorithm> #include <vector> #include <set> #include <queue> using namespace std; int A[100002], check[100002]; int idx = 1; int N, x, y; vector<int> edge[100002]; queue<int> q; int main() { cin >> N; for (int i = 0; i < N-1; i++) { cin >> x >> y; edge[x].push_back(y); edge[y].push_back(x); } for (int i = 0; i < N; i++) { cin >> A[i]; } if (A[0] != 1) { cout << 0; return 0; } q.push(1); check[1] = 1; set<int> s; while (!q.empty()) { int now = q.front(); q.pop(); int sz = 0; for (int next : edge[now]) { if (check[next] == 0) { s.insert(next); check[next] = 1; sz++; } } for(int i=idx; i<idx + sz; i++) { if (s.count(A[i]) == 0) { cout << 0; return 0; } else q.push(A[i]); } idx += sz; } cout << 1; return 0; }
반응형'PS' 카테고리의 다른 글
백준 dfs 스페셜 저지 (0) 2020.04.10 백준 16973번 직사각형 탈출 (0) 2020.04.08 백준 16957번 체스판 위의 공 (0) 2020.03.24 백준 5014번 스타트링크 (0) 2020.03.24 백준 17069번 파이프 옮기기2 (0) 2020.03.22