Algorithm
백준 - 24444
smallsoft
2024. 11. 1. 16:28
문제요약
[[백준 - 24479]] 문제와 완전 똑같은 문제이다. 24479 문제는 dfs를 요구했지만 이번문제는 bfs를 요구한다.
bfs(V, E, R) { # V : 정점 집합, E : 간선 집합, R : 시작 정점
for each v ∈ V - {R}
visited[v] <- NO;
visited[R] <- YES; # 시작 정점 R을 방문 했다고 표시한다.
enqueue(Q, R); # 큐 맨 뒤에 시작 정점 R을 추가한다.
while (Q ≠ ∅) {
u <- dequeue(Q); # 큐 맨 앞쪽의 요소를 삭제한다.
for each v ∈ E(u) # E(u) : 정점 u의 인접 정점 집합.(정점 번호를 **오름차순**으로 방문한다)
if (visited[v] = NO) then {
visited[v] <- YES; # 정점 v를 방문 했다고 표시한다.
enqueue(Q, v); # 큐 맨 뒤에 정점 v를 추가한다.
}
}
}
문제에서는 친절히 bfs의 기본형태를 제공해 준다.
따로 문제요약은 작성하지 않겠다. 24479와 완전히 똑같은 입력과 출력을 요구하고 안의 로직만 dfs, bfs 차이가 있으므로 링크로 대체한다.
수도코드
- visited []을 준비한다. 원래는
bool
타입의 visited []을 사용하는데 이 문제에서는 방문순서를 저장해야하기때문에 visited[]을 int로 설정해 0이면 방문하지않았음 1이상이면 방문했음을 표시했다. - bfs를 돌린다.
- visited[]을 출력한다.
소스코드는 다음과 같다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
int vist[100005] = {0,};
int n, m, r;
vector<int> v[200005];
int main() {
cin >> n >> m >> r;
for (int i = 0; i < m; i++) {
int tmp;
int tmp1;
cin >> tmp >> tmp1;
v[tmp].push_back(tmp1);
v[tmp1].push_back(tmp);
}
for (int i = 0; i < m; i++) {
sort(v[i].begin(), v[i].end());
}
vist[r] = 1;
queue<int> q;
q.push(r);
int cnt = 1;
while (!q.empty()) {
int cur = q.front();
q.pop();
for (int i = 0; i < v[cur].size(); i++) {
int nxt = v[cur][i];
if (!vist[nxt]) {
vist[nxt] = ++cnt;
q.push(nxt);
}
}
}
for (int i = 1; i <= n; i++) {
cout << vist[i] << '\n';
}
}