반응형
2644번: 촌수계산
사람들은 1, 2, 3, …, n (1≤n≤100)의 연속된 번호로 각각 표시된다. 입력 파일의 첫째 줄에는 전체 사람의 수 n이 주어지고, 둘째 줄에는 촌수를 계산해야 하는 서로 다른 두 사람의 번호가 주어진다. 그리고 셋째 줄에는 부모 자식들 간의 관계의 개수 m이 주어진다. 넷째 줄부터는 부모 자식간의 관계를 나타내는 두 번호 x,y가 각 줄에 나온다. 이때 앞에 나오는 번호 x는 뒤에 나오는 정수 y의 부모 번호를 나타낸다. 각 사람의 부모는 최대
www.acmicpc.net
풀이 ) BFS
부모 자식 관계를 배열로 나타냈다. 이 때 행, 열의 구분은 중요하지 않다.
입력으로 들어온 촌 수를 구하고자 하는 사람 중 한명을 큐에 먼저 넣는다. 촌수를 구하기 위해 촌수를 구분하기 위해 구분자 역할을 하는 0을 넣어주었다.
입력으로 들어온 두 사람의 촌 수가 존재한다면 그 방향성은 중요하지 않기 때문에 큐에 넣고 빼는 동작을 하는 과정에서는 답이 증가하기만 한다.
과정을 반복하는 중 큐가 비었을 때, 즉 딜리미터인 0이 연속으로 있는 경우는 촌수관계가 없기 때문에 -1을 출력한다.
#include <cstdio>
#include <queue>
using namespace std;
int n, in[2], m, child, parent, rel[101][101], visited[101], ans;
queue<int> q;
void bfs(int curr);
int main(void)
{
scanf("%d", &n);
scanf("%d%d", in, in+1);
scanf("%d", &m);
for(int i = 0; i < m; ++i){
scanf("%d%d", &child, &parent);
rel[child][parent]++;
rel[parent][child]++;
}
bfs(in[0]);
printf("%d\n", ans);
}
void bfs(int curr)
{
visited[curr]++;
q.push(curr);
q.push(0);
while(1){
int next = q.front();
if(next == in[1])
return;
if(next == 0){
q.pop();
if(q.front() == 0){
ans = -1;
return;
}
q.push(0);
ans++;
continue;
}
q.pop();
for(int i = 1; i <= n; ++i)
if(rel[next][i] && !visited[i]){
visited[i]++;
q.push(i);
}
}
}
반응형
'문제풀이 > 백준' 카테고리의 다른 글
[C++] 백준 - 2631 : 줄세우기 (0) | 2020.03.26 |
---|---|
[C++] 백준 - 11053 : 가장 긴 증가하는 부분 수열 (0) | 2020.03.25 |
[C++] 백준 - 10971 : 외판원 순회 2 (0) | 2020.03.24 |
[C++] 백준 - 2468 : 안전 영역 (0) | 2020.03.24 |
[C++] 백준 - 10451 : 순열 사이클 (0) | 2020.03.22 |