Algorithm/BaekJoon

[21278 호석이 두 마리 치킨]

돌건 2021. 6. 23. 17:31
  • 문제

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

 

21278번: 호석이 두 마리 치킨

위의 그림과 같이 1번과 2번 건물에 치킨집을 짓게 되면 1번부터 5번 건물에 대해 치킨집까지의 왕복 시간이 0, 0, 2, 2, 2 로 최소가 된다. 2번과 3번 건물에 지어도 동일한 왕복 시간이 나오지만 더

www.acmicpc.net

 

  • 접근 및 해결
1. 각 정점에 대해서 나머지 정점들까지의 최소 거리를 구한다. (플로이드-워샬)
2. 최대 100개의 정점이므로 3중 for문을 사용해 각 정점(집)에서 선택된 치킨 집 2개와의 최소 거리를 구한다.
3. 2에서 최소 값을 구하면 정답!
#include <iostream>
#define INF 987654321;
using namespace std;

int N, M;
int graph[101][101];
int dist[101][101];

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

    cin >> N >> M;
    
    int src, des;
    for(int iter = 0; iter < M; iter++) {
        cin >> src >> des;

        graph[src][des] = graph[des][src] = 1;
    }

    for(src = 1; src <= N; src++) {
        for(des = 1; des <= N; des++) {
            if(src == des) continue;
            
            if(graph[src][des]) {
                dist[src][des] = graph[src][des];
            }
            else {
                dist[src][des] = INF;
            }
        }
    }

    for(int mid = 1; mid <= N; mid++) {
        for(src = 1; src <= N; src++) {
            for(des = 1; des <= N; des++) {
                dist[src][des] = min(dist[src][des], dist[src][mid] + dist[mid][des]);
            }
        }
    }

    int answer = INF;
    pair<int, int> position;

    for(int first = 1; first <= N; first++) {
        for(int second = 1 + 1; second <= N; second++) {
            int total = 0;
            for(int index = 1; index <= N; index++) {
                total += min(dist[first][index], dist[second][index]);
            }

            if(answer > total) {
                answer = total;
                position = make_pair(first, second);
            }
        }
    }

    cout << position.first << " " << position.second << " " << answer * 2 << endl;

    return 0;
}