Notice
Recent Posts
Recent Comments
Link
전자공학 및 알고리즘
백준 2644 - 촌수계산(C++) 본문
문제 링크입니다. https://www.acmicpc.net/problem/2644
2644번: 촌수계산
사람들은 1, 2, 3, …, n (1 ≤ n ≤ 100)의 연속된 번호로 각각 표시된다. 입력 파일의 첫째 줄에는 전체 사람의 수 n이 주어지고, 둘째 줄에는 촌수를 계산해야 하는 서로 다른 두 사람의 번호가 주어
www.acmicpc.net
간단한 그래프 문제였습니다.
X -> Y 까지 가는데 거쳐가야하는 수를 구하는 문제였습니다.
예시를 통해 확인해보겠습니다.
7 -> 3 을 가는데 7 -> 2 -> 1 -> 3 으로 이동할 수 있습니다. 따라서 촌수가 3이 됩니다.
M개의 line이 주어졌을때, X와 Y를 서로 양방향으로 저장해줍니다.
시작점을 queue에 넣어준 뒤, 갈 수 있는 점들을 확인합니다.
위와 같은 과정을 계속 반복하면서 도착점에 도착했을 때, 이동 횟수를 출력해줍니다.
문제 접근 방법
1. M개의 선이 주어질때, X와 Y점을 양방향으로 저장해줍니다.
2. 시작점에서 시작해, 갈 수 있는 곳을 확인해봅니다.
3. 도착점에 도달했을 경우 이동 횟수를 return 해줍니다.
4. 탐색이 끝났는데도 도착하지 못했다면 -1을 return 해줍니다.
자세한 것은 코드를 참고해주세요.
#define _CRT_SECURE_NO_WARNINGS
#include <cstring>
#include <vector>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cmath>
#include <cstdio>
#include <string>
#include <deque>
using namespace std;
int N, M;
int start, finish;
int check[101];
vector<int> line[101];
int bfs() {
queue<pair<int,int>> q;
q.push(make_pair(start,0));
check[start] = 1;
while (!q.empty()) {
int x = q.front().first;
int cnt = q.front().second;
q.pop();
if (x == finish) {
return cnt;
}
for (int i = 0; i < line[x].size(); i++) {
int xx = line[x][i];
if (check[xx] == 0) {
check[xx] = 1;
q.push(make_pair(xx, cnt + 1));
}
}
}
return -1;
}
void solve() {
int ans = bfs();
cout << ans;
}
int main() {
cin.tie(0);
cout.tie(0);
cin >> N;
cin >> start >> finish;
cin >> M;
for (int i = 0; i < M; i++) {
int x, y;
cin >> x >> y;
line[x].push_back(y);
line[y].push_back(x);
}
solve();
return 0;
}
질문 및 조언 댓글 남겨주세요!
'백준' 카테고리의 다른 글
백준 17219 - 비밀번호 찾기(C++) (0) | 2021.11.19 |
---|---|
백준 5525 - IOIOI(C++) (0) | 2021.11.19 |
백준 1780 - 종이의 개수(C++) (0) | 2021.11.18 |
백준 1261 - 알고스팟(C++) (0) | 2021.11.16 |
백준 14923 - 미로 탈출(C++) (0) | 2021.11.16 |