매일매일 코테풀기 (일시 중단!)

(2024-11-06) 3 문제 : 백준 - 1956 (운동)

오의현 2024. 11. 6. 22:28

 

플로이드-워셜 알고리즘을 통해 모든 노드간의 최단거리를 구한 뒤에 사이클의 거리(i ->j + j -> i)의 최소값을 구하면 된다.

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <climits>

void Init()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
}

int main()
{
    Init();

    int NumCity = 0, NumEdge = 0;
    std::cin >> NumCity >> NumEdge;

    std::vector<std::vector<int>> MinDist(NumCity, std::vector<int>(NumCity, 999999999));
    for (int i = 0; i < NumCity; i++)
    {
        MinDist[i][i] = 0;
    }

    for (int i = 0; i < NumEdge; i++)
    {
        int Start = 0, End = 0, Cost = 0;
        std::cin >> Start >> End >> Cost;
        --Start, --End;

        MinDist[Start][End] = Cost;
    }

    for (int i = 0; i < NumCity; i++)
    {
        for (int j = 0; j < NumCity; j++)
        {
            for (int k = 0; k < NumCity; k++)
            {
                MinDist[j][k] = std::min(MinDist[j][k], MinDist[j][i] + MinDist[i][k]);
            }
        }
    }

    int MinCycle = INT_MAX;

    for (int i = 0; i < NumCity; i++)
    {
        for (int j = i + 1; j < NumCity; j++)
        {
            if (MinDist[i][j] != 999999999 && MinDist[j][i] != 999999999)
            {
                MinCycle = std::min(MinCycle, MinDist[i][j] + MinDist[j][i]);
            }
        }
    }

    if (MinCycle == INT_MAX)
    {
        MinCycle = -1;
    }

    std::cout << MinCycle;

    return 0;
}