문제 : https://www.acmicpc.net/problem/2644
2644번: 촌수계산
사람들은 1, 2, 3, …, n (1 ≤ n ≤ 100)의 연속된 번호로 각각 표시된다. 입력 파일의 첫째 줄에는 전체 사람의 수 n이 주어지고, 둘째 줄에는 촌수를 계산해야 하는 서로 다른 두 사람의 번호가 주어
www.acmicpc.net
오늘 푼 문제는 입력받은 사람 두명의 촌수를 계산하는 문제.
난 항상 로보트처럼 visit를 bool로 놓고 푸는 경향이 있었는데
이번 문제는 따로 count 변수를 만들지 않고 visit로 바로 계산을 하니 더 더 더 편했다.
#include <iostream>
#include <queue>
using namespace std;
int n, m;
int p1, p2;
const int MAX = 101;
int map[MAX][MAX];
int visit[MAX];
queue<int> q;
void BFS(int idx)
{
//우리 나라는 가족 혹은 친척들 사이의 관계를 촌수라는 단위로 표현하는 독특한 문화를 가지고 있다.
//이러한 촌수는 다음과 같은 방식으로 계산된다.기본적으로 부모와 자식 사이를 1촌으로 정의하고 이로부터 사람들 간의 촌수를 계산한다.
//예를 들면 나와 아버지, 아버지와 할아버지는 각각 1촌으로 나와 할아버지는 2촌이 되고, 아버지 형제들과 할아버지는 1촌, 나와 아버지 형제들과는 3촌이 된다.
//여러 사람들에 대한 부모 자식들 간의 관계가 주어졌을 때, 주어진 두 사람의 촌수를 계산하는 프로그램을 작성하시오.
q.push(idx);
while (!q.empty())
{
int idx = q.front();
q.pop();
for (int i = 1; i <= n; i++)
{
if (map[idx][i] && !visit[i])
{
q.push(i);
visit[i] = visit[idx] + 1;
}
}
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
//입력
//사람들은 1, 2, 3, …, n(1 ≤ n ≤ 100)의 연속된 번호로 각각 표시된다.
//입력 파일의 첫째 줄에는 전체 사람의 수 n이 주어지고, 둘째 줄에는 촌수를 계산해야 하는 서로 다른 두 사람의 번호가 주어진다.
//그리고 셋째 줄에는 부모 자식들 간의 관계의 개수 m이 주어진다.넷째 줄부터는 부모 자식간의 관계를 나타내는 두 번호 x, y가 각 줄에 나온다.
//이때 앞에 나오는 번호 x는 뒤에 나오는 정수 y의 부모 번호를 나타낸다.
//각 사람의 부모는 최대 한 명만 주어진다.
cin >> n;
cin >> p1 >> p2;
cin >> m;
for (int i = 0; i < m; i++)
{
int a, b;
cin >> a >> b;
map[a][b] = 1;
map[b][a] = 1;
}
BFS(p1);
if (visit[p2] == 0)
cout << -1 << "\n";
else
cout << visit[p2] << "\n";
//출력
//입력에서 요구한 두 사람의 촌수를 나타내는 정수를 출력한다.어떤 경우에는 두 사람의 친척 관계가 전혀 없어 촌수를 계산할 수 없을 때가 있다.이때에는 - 1을 출력해야 한다.
return 0;
}
'알고리즘 > DBS와BFS' 카테고리의 다른 글
[백준/C++] 7569번 토마토(3차원) - BFS (0) | 2022.01.25 |
---|---|
[백준/C++] 2667번 단지번호붙이기 - BFS (0) | 2022.01.24 |
[프로그래머스/C++] 네트워크 (BFS/DFS) (0) | 2022.01.18 |
[프로그래머스/C++] 타겟 넘버 (DFS/BFS) (0) | 2022.01.15 |
[백준/C++] 2606번 바이러스 - DFS (0) | 2022.01.14 |