[백준] 2644번 촌수계산

반응형
반응형

문제

우리 나라는 가족 혹은 친척들 사이의 관계를 촌수라는 단위로 표현하는 독특한 문화를 가지고 있다. 이러한 촌수는 다음과 같은 방식으로 계산된다. 기본적으로 부모와 자식 사이를 1촌으로 정의하고 이로부터 사람들 간의 촌수를 계산한다. 예를 들면 나와 아버지, 아버지와 할아버지는 각각 1촌으로 나와 할아버지는 2촌이 되고, 아버지 형제들과 할아버지는 1촌, 나와 아버지 형제들과는 3촌이 된다.

여러 사람들에 대한 부모 자식들 간의 관계가 주어졌을 때, 주어진 두 사람의 촌수를 계산하는 프로그램을 작성하시오.

입력

사람들은 1, 2, 3, …, n (1≤n≤100)의 연속된 번호로 각각 표시된다. 입력 파일의 첫째 줄에는 전체 사람의 수 n이 주어지고, 둘째 줄에는 촌수를 계산해야 하는 서로 다른 두 사람의 번호가 주어진다. 그리고 셋째 줄에는 부모 자식들 간의 관계의 개수 m이 주어진다. 넷째 줄부터는 부모 자식간의 관계를 나타내는 두 번호 x,y가 각 줄에 나온다. 이때 앞에 나오는 번호 x는 뒤에 나오는 정수 y의 부모 번호를 나타낸다.

각 사람의 부모는 최대 한 명만 주어진다.

출력

입력에서 요구한 두 사람의 촌수를 나타내는 정수를 출력한다. 어떤 경우에는 두 사람의 친척 관계가 전혀 없어 촌수를 계산할 수 없을 때가 있다. 이때에는 -1을 출력해야 한다.

 

힘들다.ㅜㅜ

 

그래프때랑 트리랑 두개를 비교가 잘 안된다.. 더 연습해야지...

 

이문제는 dfs 와 bfs문제랑 굉장히 유사하다..

특히나 최소값을 구하는 문제이기 때문에 bfs를 사용해야 한다.

 

#include <bits/stdc++.h>
using namespace std;

int dist[101][101];
int visit[101];
int depth[101];

int n;
void bfs(int f) {
  queue<int> q;
  q.push(f);
  visit[f] = true;

  while(!q.empty()) {
    int k = q.front();
    q.pop();

    for(int i = 1;i<=n;i++) {
        if (dist[k][i] && !visit[i]) {
          depth[i] = depth[k] + 1;
          visit[i] = true;
          q.push(i);
        }
    }
  }

}
int main(void) {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL); cout.tie(NULL);

  cin >> n;

  int findA,findB;
  cin >> findA >> findB;

  int tree;
  cin >> tree;

  for(int i = 1; i<=tree;i++) {
    int a,b;
    cin >> a >> b;
    dist[a][b] = dist[b][a] = 1;
  }

  bfs(findA);

  int result = depth[findB];
  if (result) {
     cout << depth[findB] << "\n";
  } else {
    cout << -1 << "\n";
  }
 
 }

이 문제는 다 필요없고 bfs쪽만 확인하면 될 것 같다.

 

7,2 -> 2,1 -> 1,3 이렇게 흘러가면 된다. 재 방문은 없다.

 

 

#include <stdio.h>
#include <queue>
#include <vector>
using namespace std;
 
int N;
int p1, p2;
int M;
int Adjmatrix[101][101];
bool isvisited[101]; // Search started on p1
int dist[101];
queue<int> q;
vector<int> a;
int main()
{
    for(int i = 0; i < 10000000; i++)
        a.push_back(1);
    scanf("%d", &N);
    scanf("%d %d", &p1, &p2);
    scanf("%d", &M);
    for(int i = 1; i <= N; i++){
        isvisited[i] = false;
        dist[i] = -1;
        for(int j = 1; j <= N; j++){
            Adjmatrix[i][j] = -1;
        }
    }
    isvisited[p1] = true;
    dist[p1] = 0;
    for(int i = 0; i < M; i++){
        int a, b;
        scanf("%d %d", &a, &b);
        Adjmatrix[a][b] = 1;
        Adjmatrix[b][a] = 1;
    }
    q.push(p1);
    while(!q.empty()){
        int s = q.front();
        q.pop();
 
        for(int i = 1; i <= N; i++){
            if(Adjmatrix[i][s] == 1 && !isvisited[i]){
                isvisited[i] = true;
                dist[i] = dist[s] + 1;
                q.push(i);
            }
        }
    }
    printf("%d", dist[p2]);
}
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 11134번 쿠키애호가  (0) 2020.05.09
[백준] 10451번 순열 사이클  (0) 2020.05.07
[백준] 4963번 섬의 갯수  (0) 2020.05.05
[백준] 14405번 피카츄  (2) 2020.05.04
[백준] 2178번 미로탐색  (0) 2020.05.04

댓글

Designed by JB FACTORY