[적용한 알고리즘]

플로이드 와샬

 

[아이디어]

i -> j 로 가는 경로가 있다고 가정해보자.

이때, i -> k -> j 가 가능하다면, i -> j 는 선택하면 안된다.

구하는 값이 간선의 개수를 최소화하는 것이기 때문이다.

따라서, 플로이드-와샬을 이용해서

dist[i][j] = dist[i][k] + dist[k][j] 를 만족하는 k 가 존재한다면,

그 간선을 사용하지 않으면 된다.

 

<코드>

#include <cstdio>
using namespace std;

int dist[21][21];
bool notUse[21][21];

int main(){
    int N;
    scanf("%d", &N);
    for (int i = 1; i <= N; i++){
        for (int j = 1; j <= N; j++){
            scanf("%d", &dist[i][j]);
        }
    }

    for (int k = 1; k <= N; k++){
        for (int i = 1; i <= N; i++){
            if (i == k) continue;
            for (int j = 1; j <= N; j++){
                if (i == j) continue;
                if (k == j) continue;

                if (dist[i][j] == dist[i][k] + dist[k][j]){
                    notUse[i][j] = true;
                }

                if (dist[i][j] > dist[i][k] + dist[k][j]){
                    printf("-1\n");
                    return 0;
                }
            }
        }
    }

    int ans = 0;
    for (int i = 1; i <= N; i++){
        for (int j = 1; j <= N; j++){
            if (notUse[i][j]) continue;
            ans += dist[i][j];
        }
    }

    printf("%d\n", ans / 2);
    return 0;
}

'Algorithm > BOJ' 카테고리의 다른 글

[백준] 1613번 역사  (0) 2020.02.01
[백준] 1854번 K번째 최단경로 찾기  (0) 2020.02.01
[백준] 1956번 운동  (0) 2020.02.01
[백준] 1412번 일방통행  (124) 2020.02.01
[백준] 1922번 네트워크 연결  (0) 2020.01.10

+ Recent posts