백준 21278 - 호석이 두 마리 치킨
Updated:
Java
21278 번 - 호석이 두 마리 치킨
문제
접근 방법
주어진 최대 치킨 집 수가 100개이므로, 100개 중 2개의 치킨집을 뽑는다 : 100C2
모든 노드에서 다른 노드까지 가는 최소의 거리를 구해야 하므로, 플로이드 워셜을 사용한다.
이후 조합을 통해 2개의 치킨집을 선택하고 나머지 집에서 치킨 집까지 거리를 구해, 그 거리가 최소가 되는 치킨 집과 거리를 구한다.
코드
import java.util.*;
import java.io.*;
public class Main {
static int MAX_VALUE = 987654321;
static int n, m, result = Integer.MAX_VALUE;
static int[][] graph;
static int[] sel; // 선택 된 치킨집
static boolean[] vis; // 방문 여부
static int r1, r2; // 결과를 담는 값
public static void main(String[] args) throws IOException {
System.setIn(new FileInputStream("res/mainInput.txt")); //제출 할 때 주석해야함
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stk = new StringTokenizer(br.readLine());
n = stoi(stk.nextToken());
m = stoi(stk.nextToken());
graph = new int[n + 1][n + 1];
sel = new int[2];
for(int i = 1; i <= n; i++) {
Arrays.fill(graph[i], MAX_VALUE);
graph[i][i] = 0;
}
int a,b;
for(int i = 0; i < m; i++) {
stk = new StringTokenizer(br.readLine());
a = stoi(stk.nextToken());
b = stoi(stk.nextToken());
graph[a][b] = 1;
graph[b][a] = 1;
}
// 기준이 되는 노드
for(int i = 1; i <= n; i++) {
// 시작 노드
for(int j = 1; j <= n; j++) {
if(i == j)
continue;
// 끝 노드
for(int k = 1; k <= n; k++) {
if(graph[j][k] > graph[j][i] + graph[i][k])
graph[j][k] = graph[j][i] + graph[i][k];
}
}
}
DFS(0,1);
System.out.println(r1 + " " + r2 + " " + result * 2);
br.close();
}
// 치킨 집 2개를 뽑는다.
private static void DFS(int lv, int st) {
if(lv == 2) {
int sum = 0;
for(int i = 1; i <= n; i++) {
if(sel[0] != i && sel[1] != i) {
int num = Math.min(graph[i][sel[0]], graph[i][sel[1]]);
sum += num;
}
}
if(result > sum) {
result = sum;
r1 = sel[0];
r2 = sel[1];
}
return;
}
for(int i = st; i <= n; i++) {
sel[lv] = i;
DFS(lv + 1, i + 1);
}
}
static int stoi(String str) {
return Integer.parseInt(str);
}
}