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

 

21278번: 호석이 두 마리 치킨

위의 그림과 같이 1번과 2번 건물에 치킨집을 짓게 되면 1번부터 5번 건물에 대해 치킨집까지의 왕복 시간이 0, 0, 2, 2, 2 로 최소가 된다. 2번과 3번 건물에 지어도 동일한 왕복 시간이 나오지만 더

www.acmicpc.net

코드설명

DFS와 BFS 가 섞인 문제입니다.

 

문제푸는 로직은,

1. DFS로 2개씩 조합을 구합니다.

2. 각 조합 안에서 BFS를 통하여서 최단거리를 구합니다.

 

그래프의 간선의 가중치가 모두 1로 같기에 BFS로 가능했던 문제입니다.

만약에 간선의 가중치가 존재한다면, 다른 최단경로 그래프 알고리즘을 사용해야합니다.

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static int N, M;
public static ArrayList<ArrayList<Node>> graph = new ArrayList<>();
public static boolean[] visited;
public static boolean[] counted;
public static int resultFirstIdx = 0;
public static int resultSecondIdx = 0;
public static int answer = Integer.MAX_VALUE;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
for(int i=0;i<=N;i++) {
graph.add(new ArrayList<>());
}
visited = new boolean[N+1];
for(int j=0;j<M;j++) {
st = new StringTokenizer(br.readLine());
int nodeA = Integer.parseInt(st.nextToken());
int nodeB = Integer.parseInt(st.nextToken());
graph.get(nodeA).add(new Node(nodeA, nodeB, 0));
graph.get(nodeB).add(new Node(nodeB, nodeA, 0));
}
simulate(1, 0);
System.out.println(resultFirstIdx+" "+resultSecondIdx+ " "+answer*2);
}
public static void simulate(int idx, int level) {
if(level == 2) {
counted = new boolean[N+1];
Queue<Node> q = new LinkedList<>();
int result = 0;
for(int i=1;i<=N;i++) {
if(visited[i] == true) {
q.offer(new Node(i, 0, 0));
counted[i] = true;
}
}
while(!q.isEmpty()) {
Node temp = q.poll();
int nodeA = temp.nodeA;
int cnt = temp.count;
for(int i=0;i<graph.get(nodeA).size();i++) {
if(counted[graph.get(nodeA).get(i).nodeB] == false ) {
q.offer(new Node(graph.get(nodeA).get(i).nodeB, 0, cnt + 1));
counted[graph.get(nodeA).get(i).nodeB]= true;
result += cnt + 1;
}
}
}
if(answer > result) {
answer = result;
resultFirstIdx = 0;
resultSecondIdx = 0;
for(int i=1;i<=N;i++) {
if(visited[i] == true) {
if( resultFirstIdx == 0 ) {
resultFirstIdx = i;
}else {
resultSecondIdx = i;
}
}
}
}
return ;
}
for(int i=idx;i<=N;i++) {
if(visited[i] == true) continue;
visited[i] = true;
simulate(i + 1, level + 1);
visited[i] = false;
}
}
}
class Node{
int nodeA;
int nodeB;
int count = 0;
public Node(int nodeA, int nodeB, int cnt) {
this.nodeA = nodeA;
this.nodeB = nodeB;
this.count = cnt;
}
}

+ Recent posts