16940번 BFS 스페셜 저지
이미 짜인 그래프에서, 입력이 들어올 때 그 순서대로 BFS를 했을 때 통과되는지를 확인하는 문제이다. 입력이 여러개가 가능한 이유는, BFS가 하나의 점을 queue에서 빼낼 때, 그 점에서 연결된 점들 중, 어떤 순서대로 빼든지 상관이 없기 때문이다.
1. check 배열 - 이미 꺼낸 점인지 확인
2. parent 배열 - queue에 push할때에 어떤 점과 연결되어 있는지 확인
3. order 배열 - 입력이 들어온 배열
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int ch[100001];
//int parent[100001];
int order[100001];
vector<int> graph[100001];
int main() {
ios_base::sync_with_stdio(false);
//freopen("in1.txt", "rt", stdin);
int n, i, j, a, b;
cin >> n;
for (i = 1; i < n; i++) {
cin >> a >> b;
graph[a].push_back(b);
graph[b].push_back(a);
}
for (i = 0; i < n; i++) {
cin >> order[i];
}
int m = 0;
queue<int> Q;
Q.push(1);
ch[1] = 1;
for (int i = 0; i < n; i++) {
//cout << "why?" << '\n';
if (Q.empty()) {
cout << "0" << '\n';
return 0;
}
int tmp = Q.front();
Q.pop();
if (tmp != order[i]) {
cout << "0" << '\n';
return 0;
}
int cnt = 0;
for (int k = 0; k < graph[tmp].size(); k++) {
if (ch[graph[tmp][k]] == 0) {
ch[graph[tmp][k]] = 1;
//parent[graph[tmp][k]] = tmp;
cnt++;
}
}
for (j = 1; j <= cnt; j++) {
Q.push(order[m + j]); // 2 , 3
ch[order[m + j]] = 1;
}
m += cnt;
}
cout << "1" << '\n';
return 0;
}
Author And Source
이 문제에 관하여(16940번 BFS 스페셜 저지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ehdgus5094/16940번-BFS-스페셜-저지저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)