#include <iostream>
#include <queue>
#include <tuple>
using namespace std;
#define Max 4000001
int vec[401][401];
int main()
{
int V, E;
cin >> V >> E;
for (int i = 1; i <= V; ++i)
{
for (int j = 1; j <= V; ++j)
{
vec[i][j] = Max;
}
}
while (E--)
{
int a, b, c;
cin >> a >> b >> c;
vec[a][b] = c;
}
for (int z = 1; z <= V; ++z)
{
for (int i = 1; i <= V; ++i)
{
for (int j = 1; j <= V; ++j)
{
vec[i][j] = min(vec[i][j], vec[i][z] + vec[z][j]);
}
}
}
int ans = Max;
for (int i = 1; i <= V; ++i)
{
ans = min(ans, vec[i][i]);
}
if (ans != Max)
cout << ans;
else
cout << -1;
return 0;
}
플로이드 와샬 알고리즘을 이용해 본인에게 돌아오는 서클 중 가장 작은 값을 찾아야 합니다.
i -> j 값고 i -> z -> j 값 i에서 j로 바로 통하는 값과 i에서 z값을 통해서 j로 들어가는 값을 찾아서 최소값을 찾
'오늘의 알고리즘' 카테고리의 다른 글
[C++] 백준 1450 냅색문제 (0) | 2023.05.08 |
---|---|
[C++] 백준 9370 미확인도착지 (0) | 2023.05.03 |
[C++] 백준 11657 타임머신 (0) | 2023.05.01 |
[C++] 백준 3015 오아시스 재결합 (0) | 2023.04.25 |
[C++] 백준 17299 오등큰 (1) | 2023.04.23 |