오늘의 알고리즘
[C++] 백준 1956 운동
하늘하늘 .
2023. 5. 2. 17:24
#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로 들어가는 값을 찾아서 최소값을 찾