728x90
반응형
16940번: BFS 스페셜
문제
https://www.acmicpc.net/problem/16940
16940번: BFS 스페셜 저지
올바른 순서는 1, 2, 3, 4와 1, 3, 2, 4가 있다.
www.acmicpc.net
풀이
스페셜 저지 문제는 답이 여러 개가 가능한 문제다. 이런 경우 답이 맞는지 확인하는 코드가 필요하다. BFS의 결과가 가능한지 구하는 문제다. BFS는 간선의 순서에 따라 이동하는 순서가 바뀐다. 그래서 간선의 순서를 유저가 입력한 답과 같이 이동하도록 재정렬 해줘야 한다. 어떤 순서로 정점을 방문하는지를 저장하는 order 배열을 만들고 먼저 방문해야 하는 정점과 연결된 간선이 앞으로 오도록 간선들을 재정렬 한다. 그리고 BFS를 진행하며 탐색 경로를 구한다. 이 경로가 주어진 경로와 같으면 1, 다르면 0을 출력한다.
코드
#include <bits/stdc++.h>
using namespace std;
int n, cnt = 0;
vector<int> graph[100001], visited(100001, 0), v(100001, 0), order(100001, 0), way(100001, 0);
bool cmp(int a, int b) {
return order[a] < order[b];
}
void bfs(int s) {
queue<int> q;
q.push(s);
visited[s] = 1;
way[cnt++] = s;
while (!q.empty()) {
int x = q.front();
q.pop();
for (int y : graph[x])
if (!visited[y]) {
q.push(y);
visited[y] = 1;
way[cnt++] = y;
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> n;
for (int i = 0; i < n - 1; i++) {
int a, b;
cin >> a >> b;
graph[a].push_back(b);
graph[b].push_back(a);
}
for (int i = 0; i < n; i++) {
cin >> v[i];
order[v[i]] = i;
}
for (int i = 1; i <= n; i++)
sort(graph[i].begin(), graph[i].end(), cmp);
bfs(1);
cout << (way == v ? 1 : 0) << '\n';
return 0;
}
728x90
반응형
'Problem Solving > BOJ' 카테고리의 다른 글
[백준 / BOJ] C++ 16398 행성 연결 (0) | 2023.03.24 |
---|---|
[백준 / BOJ] C++ 1922 네트워크 연결 (0) | 2023.03.24 |
[백준 / BOJ] C++ 10423 전기가 부족해 (0) | 2023.03.23 |
[백준 / BOJ] C++ 4386 별자리 만들기 (0) | 2023.03.23 |
[백준 / BOJ] C++ 11659 구간 합 구하기 4 (0) | 2023.03.23 |