본문 바로가기

[Algorithms]/[Problems]

BOJ. 11780번. 플로이드 2

728x90

 

플로이드 1에 이어서 플로이드 2 문제도 풀어보았다. 
1번이랑 다른 점은, 플로이드 워셜을 돌면서 바뀌는 내용들을 저장해야 된다는 것이다. 나는 ArrayList 배열을 선언해서, 최소비용이 갱신이 될 때마다 이를 저장하도록 만들었다. 그리고 마지막에 배열의 각 지점들을 돌면서 저장된 리스트 내용들을 출력하면 끝!

 

www.acmicpc.net/problem/11780

 

11780번: 플로이드 2

첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가

www.acmicpc.net

 

package week_11;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Day2BOJ11780 {

	static int n,m;
	static ArrayList<Integer>[][] mmap;
	static int[][] map;
	static final int INF = Integer.MAX_VALUE>>1;
	
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringBuilder sb = new StringBuilder();
		StringTokenizer st;
		
		n = Integer.parseInt(br.readLine());
		m = Integer.parseInt(br.readLine());
		map = new int[n+1][n+1];
		mmap = new ArrayList[n+1][n+1];
		
		for(int i=0; i<=n; i++) {
			Arrays.fill(map[i], INF);
			map[i][i] = 0;
		}
		for(int i=1; i<=n; i++) {
			for(int j=1; j<=n; j++) {
				mmap[i][j] = new ArrayList<Integer>();
			}
		}
		
		for(int i=0; i<m; i++) {
			st = new StringTokenizer(br.readLine());
			int a = Integer.parseInt(st.nextToken());
			int b = Integer.parseInt(st.nextToken());
			int c = Integer.parseInt(st.nextToken());
			map[a][b] = Math.min(map[a][b], c);
		}
		
		solution();
		
		for(int i=1; i<=n; i++) {
			for(int j=1; j<=n; j++) {
				sb.append(map[i][j] + " ");
			}
			sb.append("\n");
		}
		for(int i=1; i<=n; i++) {
			for(int j=1; j<=n; j++) {
				if(map[i][j]==INF || map[i][j]==0) {
					sb.append("0");
				}else {
					sb.append((mmap[i][j].size()+2) +" ");
					sb.append(i+" ");
					for(int a : mmap[i][j]) {
						sb.append(a + " ");
					}
					sb.append(j);
				}
				sb.append("\n");
			}
		}
		
		bw.write(sb.toString());
		bw.flush();
		bw.close();
		br.close();
		
	}
//	Floyd Warshall
	private static void solution() {
		for(int k=1; k<=n; k++) {
			for(int i=1; i<=n; i++) {
				if(i==k) continue;
				for(int j=1; j<=n; j++) {
					if(k==j || i==j) continue;
					if(map[i][k]==INF || map[k][j]==INF) continue;
					if(map[i][j] > map[i][k]+map[k][j]) {
						map[i][j] = map[i][k]+map[k][j];
					    mmap[i][j] = new ArrayList<Integer>();
					    for(int a : mmap[i][k]) {
					    	mmap[i][j].add(a);
					    }
					    mmap[i][j].add(k);
					    for(int a : mmap[k][j]) {
					    	mmap[i][j].add(a);
					    }
					}
				}
			}
		}
	}

}
728x90

'[Algorithms] > [Problems]' 카테고리의 다른 글

BOJ. 11657번. 타임머신  (0) 2021.04.09
BOJ. 1238번. 파티  (0) 2021.04.01
BOJ. 20061번. 모노미노도미노 2  (0) 2021.03.29
BOJ. 1600번. 말이 되고픈 원숭이  (0) 2021.03.24
BOJ. 16637번. 괄호 추가하기  (0) 2021.03.21