PS
백준 16940번 BFS 스페셜 저지
남마허
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;
}
반응형