🍞 Problem Solving/Baekjoon

[백준] 1956 운동 c++

박빵이 2022. 9. 5. 00:16

풀이과정

사이클이 생기는 부분의 최소합을 구하면 되는 문제이다.  
i == j일 때는 continue 해주고, arr[i][j] + arr[j][i]일 때의 최솟값을 구하면 된다.  
만약 res가 INF일 경우는, 사이클이 되는 곳이 한 곳도 없으므로 -1을 출력해준다.

 

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;

int V, E, a, b, c;
int arr[401][401];
const int INF = 1e9;

void floyd() {
	for (int k = 1; k <= V; k++) {
		for (int i = 1; i <= V; i++) {
			for (int j = 1; j <= V; j++) {
				if (arr[i][j] > arr[i][k] + arr[k][j]) {
					arr[i][j] = arr[i][k] + arr[k][j];
				}
			}
		}
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	cin >> V >> E;
  	// 플로이드 와샬 초기 설정
	for (int i = 1; i <= V; i++) {
		for (int j = 1; j <= V; j++) {
			if (i != j) arr[i][j] = INF;
		}
	}
	for (int i = 0; i < E; i++) {
		cin >> a >> b >> c;
		arr[a][b] = c;
	}
	floyd();

	int res = INF;
	for (int i = 1; i <= V; i++) {
		for (int j = 1; j <= V; j++) {
			if (i == j) continue;
			res = min(res, arr[i][j] + arr[j][i]);
		}
	}
	cout << (res == INF ? -1 : res);
}