※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 1956번 문제인 운동이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/1956 

 

1956번: 운동

첫째 줄에 V와 E가 빈칸을 사이에 두고 주어진다. (2 ≤ V ≤ 400, 0 ≤ E ≤ V(V-1)) 다음 E개의 줄에는 각각 세 개의 정수 a, b, c가 주어진다. a번 마을에서 b번 마을로 가는 거리가 c인 도로가 있다는 의

www.acmicpc.net

방향그래프의 각 점에서 자기자신으로 가는 최단거리 사이클을 모두 구하는 문제는 플로이드-워셜(Floyd-Warshall) 알고리즘을 이용하여 간단히 해결할 수 있다.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;

int dist[401][401];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	int N, E; cin >> N >> E;
	
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= N; j++) {
			dist[i][j] = 11111111;
		}
	}

	while (E--) {
		int x, y, w; cin >> x >> y >> w;
		dist[x][y] = w;
	}

	for (int k = 1; k <= N; k++) {
		for (int i = 1; i <= N; i++) {
			for (int j = 1; j <= N; j++) {
				if (dist[i][j] > dist[i][k] + dist[k][j]) {
					dist[i][j] = dist[i][k] + dist[k][j];
				}
			}
		}
	}

	int ans = 11111111;
	for (int k = 1; k <= N; k++) {
		ans = min(ans, dist[k][k]);
	}

	if (ans == 11111111) cout << -1;
	else cout << ans;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 2482 // C++] 색상환  (0) 2021.08.20
[BOJ 12970 // C++] AB  (0) 2021.08.19
[BOJ 1990 // C++] 소수인팰린드롬  (0) 2021.08.17
[BOJ 1969 // C++] DNA  (0) 2021.08.16
[BOJ 20136 // C++] 멀티탭 스케줄링 2  (0) 2021.08.15

+ Recent posts