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

solution

code

#include <iostream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;

const int INF = INT_MAX;

vector<pair<int, int>> adj[10001];

void dijkstra(int start, int ** dist)
{
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
    pq.push({0,start});
    dist[start][start] = 0;

    while(!pq.empty())
    {
        int u = pq.top().second;
        pq.pop();

        for(auto v : adj[u])
        {
            int w = v.first;
            int weight = v.second;
            if(dist[start][u] + 1 < dist[start][w])
            {
                dist[start][w] = dist[start][u] + 1;
                pq.push({dist[start][w], w});
            }
        }
    }
}

int main()
{
    int n, m;
    cin >> n >> m;

    int ** dist = new int*[n+1];
    for(int i = 0; i < n+1; i++)
        dist[i] = new int[n+1];
    for(int i = 0; i < n+1; i++)
    {
        for(int j = 0; j < n+1; j++)
            dist[i][j] = INF;
    }
    for(int i = 0; i < m; i++)
    {
        int u, v;
        cin >> u >> v;
        adj[u].push_back({v, 1});
        adj[v].push_back({u, 1});
    }

    for(int i = 1; i <= n; i++)
        dijkstra(i, dist);

    int * sum = new int[n+1];
    for(int i = 0; i < n+1; i++)
        sum[i] = 0;
    
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= n; j++)
        {
            sum[i] += dist[i][j];
        }
    }
    int idx;
    int min = 99999;
    for(int i = 1; i <= n; i++)
    {
        if(min > sum[i])
        {
            min = sum[i];
            idx = i;
        }
    }
    cout << idx << endl;

    return 0;
}

ref

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

23. 다익스트라(Dijkstra) 알고리즘