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

코드설명

BFS(넓이우선탐색)을 활용합니다.

 

각 노드에서 BFS를 돌면서 각 노드까지의 최단거리를 구하는 문제였습니다.

그리고 그 최단거리를 모두 더해서 가장 짧은 거리인 노드의 위치를 출력합니다.

 

최단경로 알고리즘인 플로이드-워셜이나 다익스트라 알고리즘도 사용할 수 있을 것으로 보입니다.

다만 이 문제에서는 플로이드-워셜이 훨씬 적합합니다.

플로이드-워셜은 모든 정점에서의 모든 정점까지의 거리를 구할 수 있고, 다익스트라 알고리즘의 경우 한 정점에서 다른 모든 정점까지의 최단거리를 구하기에 그렇지요.

코드

package Main;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
 
public class Main {
	static int N, M, S, P, A, B, X, L, R, C, n, k, m, l, K;
	static int answer = 100 * (100 + 1) / 2;
	static int[][] dist = new int[101][101];
	static int[][] matrix = new int[101][101];
	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<101; i++) {
			Arrays.fill(dist[i], -1);
		}
		for(int i=0;i<M;i++) {
			st = new StringTokenizer(br.readLine());
			int A = Integer.parseInt(st.nextToken()) - 1;
			int B = Integer.parseInt(st.nextToken()) - 1;
			matrix[A][B] = matrix[B][A] = 1;
		}
		
		for(int i=0; i<N; i++) {
			BFS(i);
		}
		
		int answerIdx = -1;
		for(int i=0; i<N; i++) {
			int temp = 0;
			for(int j=0; j<N; j++) {
				temp += dist[i][j];
			}
			if(answer > temp) {
				answer = temp;
				answerIdx = i + 1;
			}
		}
		System.out.println(answerIdx);
	}
	
	static void BFS(int src) {
		Queue<int[]> q = new LinkedList<>();
		q.offer(new int[] {src, 0});
		dist[src][src] = 0;
		
		while(!q.isEmpty()) {
			int[] temp = q.poll();
			int nowNode = temp[0];
			int cnt = temp[1];
			
			for(int connect = 0; connect < matrix[nowNode].length; connect++) {
				if(matrix[nowNode][connect] == 1 && dist[src][connect] == -1) {
					dist[src][connect] = cnt + 1;
					q.offer(new int[] {connect, cnt + 1});
				}
			}
		}
		
	}
	
}

+ Recent posts