문제풀이/백준oj
[백준OJ] 6118번 숨바꼭질
Hyeon-Uk
2021. 8. 4. 01:06
반응형
https://www.acmicpc.net/problem/6118
6118번: 숨바꼭질
재서기는 수혀니와 교외 농장에서 숨바꼭질을 하고 있다. 농장에는 헛간이 많이 널려있고 재서기는 그 중에 하나에 숨어야 한다. 헛간의 개수는 N(2 <= N <= 20,000)개이며, 1 부터 샌다고 하자. 재
www.acmicpc.net
-풀이-
간단한 BFS문제이다. BFS를 이용하여 각 방까지의 최단거리를 모두 구해준 뒤, 최단거리가 가장 큰 방( 같은 값이 두개이상 있다면, 방번호가 작은방) 을 구해준 뒤, 해당 방과 거리가 같은 방들의 개수를 구해준다음 모두 출력해주면된다.
-시간복잡도-
BFS알고리즘은 O(V+E)이므로, 여기선 O(N+M)이 된다.
나머지 구해주는 로직은 모두 O(N)선에서 끝나므로, 최종 시간복잡도는 O(N+M)이 된다.
-코드-
#include <iostream>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
vector<int> maze[20001];
int visited[20001] = { 0 };
int n, m;
void make_graph() {
for (int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
maze[a].push_back(b);
maze[b].push_back(a);
}
}
void input() {
cin >> n >> m;
make_graph();
}
void bfs() {
queue<pair<int, int>> q;
q.push({ 1,1 });
visited[1] = 1;
while (!q.empty()) {
int now = q.front().first;
int dist = q.front().second;
q.pop();
for (int next : maze[now]) {
if (!visited[next]) {
visited[next] = dist + 1;
q.push({ next,dist + 1 });
}
}
}
int max = 0;
int max_cnt = 0;
int maxNode = -1;
for (int i = 2; i <= n; i++) {
if (max < visited[i]) {
max = visited[i];
maxNode = i;
}
}
for (int i = 2; i <= n; i++) {
if (max == visited[i]) max_cnt++;
}
cout << maxNode << " " << visited[maxNode] - 1 << " " << max_cnt;
}
void solve() {
input();
bfs();
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
solve();
return 0;
}
반응형