개발/알고리즘

백준 1956번 운동

dev-yoon-jerry 2021. 6. 18. 23:32

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

플로이드 와샬 연습용문제. 

  1. 400 x 400 이므로 인접행렬로 풀었음 (생각해보니 플로이드문제중에 인접리스트로 푸는게 있던가?..)
  2. 배열 INF값으로 초기화
  3. edge 넣어줌 edges[a][b] = dist;  // a -> b는 거리가 dist
  4. 플로이드와샬 경출도 (경유지, 출발지, 도착지)   edges[a][b] > edges[a][k] + edges[k][a] 면 갱신. 출발지에서 어디경유해서 도착지로 가는 비용이 현재 출발지에서 도착지로 최소 비용보다 적은 경우!
  5. 사이클이랬으니 출발지 -> 출발지로 가는 최소 비용 체크
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class bj1956 {
	static int [][] edges;
	static int V,E;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		V = Integer.parseInt(st.nextToken());
		E = Integer.parseInt(st.nextToken());
		edges = new int[V+1][V+1];
		for(int[] e : edges) {
			Arrays.fill(e, 987654321); //INF로 초기화
		}
		for(int e=0;e<E;e++) {
			st = new StringTokenizer(br.readLine());
			int a = Integer.parseInt(st.nextToken());
			int b = Integer.parseInt(st.nextToken());
			int dist = Integer.parseInt(st.nextToken());
			edges[a][b] = dist;
		}
		//플로이드와샬 경출도
		for(int k=1;k<V+1;k++) {
			for(int i=1;i<V+1;i++) {
				for(int j=1;j<V+1;j++) {
					edges[i][j] = Math.min(edges[i][k]+edges[k][j],edges[i][j]);
				}
			}
		}
		int min = 987654321;
		for(int i=1;i<=V;i++) {//사이클 최소비용 체크
			min = Math.min(min, edges[i][i]);
		}
		if(min==987654321) min = -1; //사이클이 없음
		System.out.println(min);
	}
}

'개발 > 알고리즘' 카테고리의 다른 글

백준 12851번 숨바꼭질2  (0) 2021.06.22
백준 1937번 욕심쟁이 판다  (0) 2021.06.20
백준 11779번 최소비용 구하기2  (0) 2021.06.17
백준 1062번 가르침  (0) 2021.06.17
백준 9465번 스티커  (0) 2021.06.10