-
반응형
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; }
반응형'문제풀이 > 백준oj' 카테고리의 다른 글
[백준OJ] 8972번 미친 아두이노 (0) 2021.08.06 [백준OJ] 13460번 구슬 탈출 2 (0) 2021.08.05 [백준OJ] 1305번 광고 (0) 2021.08.04 [백준OJ] 13302번 리조트 (0) 2021.08.03 [백준OJ] 15961번 회전 초밥 (0) 2021.08.02 댓글