#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

+ Recent posts