백준 2644 - 촌수계산
생각 및 접근
- 구구절절 말이 길지만, 결국 사람과 사람이 주어질 때, 몇 다리 건너서 만날 수 있는지 구하는 문제였다.
m[101][101]
: 사람들의 촌수 계산을 위해 인접행렬을 선언했다.tar1
과tar2
가 몇 다리 건너서 만날 수 있는 지 DFS로 풀어보고자 헀다. DFS는 가장 먼저 찾은 해답이 최단 다리라고 보장하지 못하므로, 사실상 모든 경로를 탐색해야 한다. 그나마 탐색하는 경로를 줄이기 위해, 탐색 여부를 저장하는visit[101]
를 선언한다.- DFS의 종료 조건
- 내가 탐색하려는 index가
tar2
일 때 - 최단 거리를 저장하는
answer
와cnt
를 비교해서 더 작은 값으로answer
를 업데이트한다.
- 내가 탐색하려는 index가
- DFS 탐색
// 사람 수 만큼 탐색 for (int i = 1; i <= n; i++) { // 아직 탐색되지 않은 사람이고, 연결이 되어 있다면 dfs할 수 있다. if (visit[i] == 0 && m[index][i] == 1) { visit[i] = 1; dfs(i, cnt + 1); visit[i] = 0; } }
코드
#include <bits/stdc++.h>
using namespace std;
int m[101][101], visit[101];
int n, a, b, cases, tar1, tar2, answer = 101;
void dfs(int index, int cnt) {
if (index == tar2) {
answer = min(answer, cnt);
}
else {
for (int i = 1; i <= n; i++) {
if (visit[i] == 0 && m[index][i] == 1) {
visit[i] = 1;
dfs(i, cnt + 1);
visit[i] = 0;
}
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> n >> tar1 >> tar2 >> cases;
for (int i = 1; i <= cases; i++) {
cin >> a >> b;
m[a][b] = 1;
m[b][a] = 1;
}
visit[tar1] = 1;
dfs(tar1, 0);
if (answer == 101) cout << -1;
else cout << answer;
}
채점 결과
'Coding Test > acmicpc' 카테고리의 다른 글
백준 2573 - 빙산 (c++) (0) | 2020.08.31 |
---|---|
백준 7569 - 토마토 (c++) (0) | 2020.08.28 |
백준 5557 - 1학년 (c++) (0) | 2020.08.24 |
백준 1495 - 기타리스트 (c++) (0) | 2020.08.24 |
백준 2294 - 동전 2 (c++) (0) | 2020.08.19 |