Problem Solving/BOJ

[백준 / BOJ] C++ 1956 운동

nageune 2023. 2. 25. 05:21
728x90
반응형

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

 

 

풀이

어느 점에서 다른 한 점까지 갔다가 다시 출발점으로 돌아오는 사이클의 길이의 최솟값을 찾는 문제다. 플로이드 워셜 알고리즘으로 각 정점 간 거리를 구하고 모든 경우의 수를 탐색하며 최솟값을 찾는 방식으로 풀었다.

 

 

코드

#include <bits/stdc++.h>
using namespace std;
#define INF 1e9

int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  int V, E, dist[401][401];
  cin >> V >> E;
  // dist 배열 초기화
  for (int i = 1; i <= V; i++)
    for (int j = 1; j <= V; j++)
      dist[i][j] = i == j ? 0 : INF;
  // 간선 입력
  while (E--) {
    int a, b, c;
    cin >> a >> b >> c;
    dist[a][b] = c;
  }
  // 플로이드 워셜
  for (int k = 1; k <= V; k++)
    for (int i = 1; i <= V; i++)
      for (int j = 1; j <= V; j++)
        dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
  // i->j + j->i 더한 값의 최솟값 비교
  int ans = INF;
  for (int i = 1; i <= V; i++)
    for (int j = 1; j <= V; j++)
      if (dist[i][j]) // 거리가 0이 아니면!
        ans = min(ans, dist[i][j] + dist[j][i]);
  // 사이클이 없으면 -1 출력
  cout << (ans != INF ? ans : -1) << '\n';
  return 0;
}

 

728x90
반응형