https://www.acmicpc.net/problem/2644
문제를 보면서 풀이 방법에 대해서 정말 많은 고민을 했다.
구해야 하는 두 사람의 촌수를 계산할 때 부모와 자식 관계를 따로 저장해야 하는지...
그런데 생각을 해보니깐 두 사람의 촌수를 계산하려면 부모이든 자식이든 얼마나 떨어져 있는지를 알기만 하면 된다.
예를 들어 1의 자식이 2이고, 2의 자식이 3이라고 해보자.
이때 1과 3의 거리는 1->2->3으로 접근을 해서 3을 구할 수 있다.
그렇다면 그 반대도 가능하다. 3->2->1로 접근을 해서 3을 구할 수 있다.
양방향으로 서로가 연결되어 있도록 저장을 한 다음에
bfs를 통해서 거리 값을 구하면 된다.
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 | #include <iostream> #include <vector> #include <queue> using namespace std; int main() { int n, p1, p2, m; cin >> n >> p1 >> p2 >> m; int x, y; vector<int> vec[101]; vector<int> visited(101, 0); for (int i = 0; i < m; i++) { cin >> x >> y; vec[x].push_back(y); vec[y].push_back(x); } queue<int> q; q.push(p1); while (!q.empty()) { int p = q.front(); q.pop(); if (p == p2) { break; } for (int i = 0; i < vec[p].size(); i++) { if (!visited[vec[p][i]]) { visited[vec[p][i]] = visited[p] + 1; q.push(vec[p][i]); } } } if (visited[p2] != 0) cout << visited[p2] << endl; else cout << -1 << endl; } | cs |
'알고리즘(BOJ) > BFS' 카테고리의 다른 글
백준 5014번 - 스타트링크 (0) | 2018.02.11 |
---|---|
백준 2589번 - 보물섬 (0) | 2018.01.30 |
백준 1389번 - 케빈 베이컨의 6단계 법칙 (0) | 2018.01.28 |
백준 7576번 - 토마토 (0) | 2018.01.28 |
백준 7562번 - 나이트의 이동 (0) | 2018.01.28 |