수학과의 좌충우돌 프로그래밍

[C++] BAEKJOON 1389 케빈 베이컨의 6단계 법칙 본문

알고리즘/C++

[C++] BAEKJOON 1389 케빈 베이컨의 6단계 법칙

ssung.k 2019. 11. 3. 18:43

https://www.acmicpc.net/problem/1389

 

1389번: 케빈 베이컨의 6단계 법칙

첫째 줄에 유저의 수 N (2 ≤ N ≤ 100)과 친구 관계의 수 M (1 ≤ M ≤ 5,000)이 주어진다. 둘째 줄부터 M개의 줄에는 친구 관계가 주어진다. 친구 관계는 A와 B로 이루어져 있으며, A와 B가 친구라는 뜻이다. A와 B가 친구이면, B와 A도 친구이며, A와 B가 같은 경우는 없다. 친구 관계는 중복되어 들어올 수도 있으며, 친구가 한 명도 없는 사람은 없다. 또, 모든 사람은 친구 관계로 연결되어져 있다.

www.acmicpc.net

bfs 를 이용하여 문제를 해결하였습니다.

  • 인접리스트를 이용하여 각 유저간의 연결 관계를 표시합니다.

    for (int i=0;i<M;i++){
      int n1, n2;
      cin >> n1 >> n2;
      v[n1].push_back(n2);
      v[n2].push_back(n1);
    }
    
  • 각 유저마다 bfs 를 통해 케빈 베이컨의 수 를 계산하여 그 값 중 최솟값을 출력합니다.

  • bfs 에서 케빈 베이컨의 수 를 계산하기 위해 visited 배열을 이용하였습니다. visited 배열은 -1로 초기화하여 -1일 경우 방문하지 않은 노드로 확인을 했습니다. 또한 visited[i] 의 값은 start 노드로 부터 i 번째 노드까지의 다리의 개수입니다. 이를 result 에 계속 더해줌으로서 케빈 베이컨의 수 를 계산 할 수 있습니다.

#include <iostream>
#include <vector>
#include <queue>
#include <cstring>

using namespace std;

int visited[101];
vector<int> v[101];

int bfs(int start){
    queue<int> q;
    q.push(start);
    visited[start] = 0;
    
    int result = 0;
    
    while (!q.empty()){
        int now = q.front();
        q.pop();
        result += visited[now];
        for (int next:v[now]){
            if (visited[next] == -1){
                visited[next] = visited[now] + 1;
                q.push(next);
            }
        }
    }
    return result;
}

int main(int argc, const char * argv[]) {
    
    int N,M;
    cin >> N >> M;
    
    for (int i=0;i<M;i++){
        int n1, n2;
        cin >> n1 >> n2;
        v[n1].push_back(n2);
        v[n2].push_back(n1);
    }
    
    int minNum = 987654321;
    int answer = 0;
    
    for (int i=1;i<=N;i++){
        memset(visited, -1, sizeof(int)*(N+1));
        int result = bfs(i);
        if (result < minNum){
            minNum = result;
            answer = i;
        }
    }
    
    cout << answer << "\n";

    return 0;
}

 

'알고리즘 > C++' 카테고리의 다른 글

[C++] BAEKJOON 11559 Puyo Puyo  (0) 2019.11.04
[C++] BAEKJOON 2573 빙산  (0) 2019.11.03
[C++] BAEKJOON 6593 상범 빌딩  (0) 2019.11.01
[C++] BAEKJOON 2146 다리 만들기  (0) 2019.10.31
[C++] BAEKJOON 2468 안전 영역  (0) 2019.10.31
Comments