반응형
https://www.acmicpc.net/problem/16940
16940번: BFS 스페셜 저지
올바른 순서는 1, 2, 3, 4와 1, 3, 2, 4가 있다.
www.acmicpc.net
[ 문제풀이 ]
1. 그래프를 입력받고, bfs를 돌면서 각 노드의 부모 노드와 깊이를 저장합니다.
2. 방문 순서를 입력 받으면서 해당 노드의 순서를 arr 배열에 저장하고, 바로 직전 노드를 temp 변수에 저장합니다.
3. 첫 방문 순서가 1이 아니라면 0을 출력합니다.
4. 직전 노드의 부모 노드와 현재 노드의 부모 노드의 순서를 비교하고, 진전 노드와 현재 노드의 깊이를 비교하여 직전 노드의 값들이 현재 노드보다 더 크다면 0을 출력하고, 그렇지 않다면 1을 출력합니다.
[ 소스코드 ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | #include<iostream> #include<queue> #include<vector> using namespace std; int N; vector<int> list[100001]; int visited[100001]; int arr[100001]; int parent[100001]; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> N; for (int i = 0; i < N - 1; i++) { int u, v; cin >> u >> v; list[u].push_back(v); list[v].push_back(u); } queue<pair<int, int>> q; q.push({ 1,1 }); while (!q.empty()) { const int cur = q.front().first; const int cnt = q.front().second; q.pop(); visited[cur] = cnt; for (auto next : list[cur]) { if (visited[next] == 0) { parent[next] = cur; visited[next] = cnt + 1; q.push({ next,cnt + 1 }); } } } int temp = 0; for (int i = 0; i < N; i++) { int num; cin >> num; arr[num] = i; if ((i == 0 && num != 1) || arr[parent[num]] < arr[parent[temp]] || visited[num] < visited[temp]) { cout << 0; return 0; } temp = num; } cout << 1; } | cs |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 3755번 - Double Queue (C++) (0) | 2023.09.11 |
---|---|
[ 백준 ] 15918번 - 랭퍼든 수열쟁이야!! (C++) (0) | 2023.09.10 |
[ 백준 ] 16936번 - 나3곱2 (C++) (0) | 2023.09.08 |
[ 백준 ] 11567번 - 선진이의 겨울 왕국 (C++) (0) | 2023.09.07 |
[ 백준 ] 3184번 - 양 (C++) (0) | 2023.09.06 |