티스토리 뷰

알고리즘/백준(BOJ)

백준 - 1956 운동

시나모온 2020. 6. 22. 03:11

문제 링크입니다 : https://www.acmicpc.net/problem/1956

 

1956번: 운동

첫째 줄에 V와 E가 빈칸을 사이에 두고 주어진다. (2<=V<=400, 0<=E<=V*(V-1)) 다음 E개의 줄에는 각각 세 개의 정수 a, b, c가 주어진다. a번 마을에서 b번 마을로 가는 거리가 c인 도로가 있다는 의미이다.

www.acmicpc.net

 

 

플로이드 와샬 문제이다. 사이클 구하는건 i -> j 경로랑 j -> i 경로가 있는지만 확인하면 된다.

 

 

 

#include <iostream>
#include <vector>
#define INF 987654321

using namespace std;

int V, E;

vector<vector<int>> board;

vector<vector<int>> floydWarshall() {
    vector<vector<int>> ret;

    ret = board;

    for(int k = 0; k < V; k++) {
        for(int i = 0; i < V; i++) {
            for(int j = 0; j < V; j++) {
                if(ret[i][k] + ret[k][j] < ret[i][j]) {
                    ret[i][j] = ret[i][k] + ret[k][j];
                }
            }
        }
    }
    return ret;
}


int main() {
    cin >> V >> E;
    board.assign(V, vector<int>(V, INF));

    int u, v, cost;
    for(int i = 0; i < E; i++) {
        cin >> u >> v >> cost;
        if(board[u - 1][v - 1] > cost) {
            board[u - 1][v - 1] = cost;
        }
    }

    for(int i = 0; i < V; i++) {
        board[i][i] = 0;
    }


    vector<vector<int>> temp = floydWarshall();

    int min = INF;
    for(int i = 0; i < V; i++) {
        for(int j = 0; j < V; j++) {
            if(i == j) continue;
            if(temp[i][j] == INF || temp[j][i] == INF) continue;
            int cycle = temp[i][j] + temp[j][i];
            if(cycle < min) {
                min = cycle;
            }
        }
    }

    if(min == INF) {
        cout << -1;
    } else {
        cout << min;
    }



    return 0;
}

 

 

 

개발 환경 : vscode

지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

 

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

백준 - 12851 숨바꼭질 2  (0) 2020.06.25
백준 - 2293 동전1  (0) 2020.06.23
백준 - 10217 KCM Travel  (2) 2020.06.22
백준 - 11404 플로이드  (0) 2020.06.21
백준 - 2037 문자메시지  (0) 2020.06.21
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함