Search
Duplicate
📗

숨바꼭질

주차
문제번호
6118
언어
C++
티어
실버
유형
그래프
BFS
nj_Blog
nj_상태
이해도
100%
풀이
사람
이해도 2
13 more properties

문제접근

인접 리스트
visited를 pair<1번 헛간과의 거리, 헛간 번호>로 저장을 하면서 visited.first를 -1로 초기화하여 visited체크
bfs로 1번 헛간까지의 거리를 다 구했다면 sort를 통해서 정렬

놓쳤던 부분

헛간과의 거리는 최소여야 하기 때문에 bfs로만 가능. dfs 불가능

코드

3848 KB

16 ms

#include <iostream> #include <vector> #include <queue> #include <utility> #include <algorithm> using namespace std; vector<vector<int> > board; vector<pair<int, int> > visited; void bfs(int start) { queue<int> q; q.push(start); visited[start].first++; visited[start].second = start; while (!q.empty()) { int current = q.front(); q.pop(); for (unsigned int i = 0; i < board[current].size(); i++) { int next = board[current][i]; if (visited[next].first != -1) continue ; q.push(next); visited[next].first = visited[current].first + 1; visited[next].second = next; } } } bool cmp(const pair<int, int> &a, const pair<int, int> &b) { if (a.first == b.first) return (a.second < b.second); return (a.first > b.first); } int main(void) { int n, m; int answerCount = 1; ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> m; board.resize(n + 1); visited.resize(n + 1, pair<int, int>(-1, 0)); for (int i = 0; i < m; i++) { int input1, input2; cin >> input1 >> input2; board[input1].push_back(input2); board[input2].push_back(input1); } bfs(1); sort(visited.begin(), visited.end(), cmp); for (int i = 1; i <= n; i++) if (visited[0].first == visited[i].first) answerCount++; cout << visited.begin()->second << " " << visited.begin()->first << " " << answerCount; return (0); }
C++
복사