정보
전형적인 플로이드 - 워셜 알고리즘의 문제였다.
n이 400 이하의 자연수이고, 플로이드 - 워셜 알고리즘의 시간복잡도는 O(n^3) 이므로, 최대 400 x 400 x 400 으로 64,000,000 이다. 100,000,000 이 대략 1초이고, 문제의 시간 제한이 1초이니 시간제한에 걸리지도 않을 것으로 예상했다.
플로이드 - 워셜 알고리즘에 대한 이해만 있다면 누구나 풀 수 있는 문제이므로
이 알고리즘을 모른다면 공부하고 오는 것을 추천한다.
플로이드 - 워셜 알고리즘은 모든 정점에서 다른 정점으로 가는 최단 거리를 구하는 알고리즘이다.
import java.io.*;
import java.util.*;
public class Main{
static int INF=100000000;
public static void main(String[] args) throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb=new StringBuilder();
st=new StringTokenizer(br.readLine());
int n=Integer.parseInt(st.nextToken());
int m=Integer.parseInt(st.nextToken());
int dist[][]=new int[n+1][n+1];
for(int i=0;i<dist.length;i++) {
for(int j=0;j<dist.length;j++) {
if(i!=j) dist[i][j] =INF;
}
}
for(int i=0;i<m;i++) {
st=new StringTokenizer(br.readLine());
int node1=Integer.parseInt(st.nextToken());
int node2=Integer.parseInt(st.nextToken());
dist[node1][node2]=1;
}
for(int i=1;i<dist.length;i++) {
for(int j=1;j<dist.length;j++) {
for(int k=1;k<dist.length;k++) {
dist[j][k]=Math.min(dist[j][k], dist[j][i]+dist[i][k]);
}
}
}
int s=Integer.parseInt(br.readLine());
for(int i=0;i<s;i++) {
st=new StringTokenizer(br.readLine());
int node1=Integer.parseInt(st.nextToken());
int node2=Integer.parseInt(st.nextToken());
if(dist[node1][node2]==INF&&dist[node2][node1]==INF)
sb.append(0);
else if(dist[node1][node2]!=INF)
sb.append(-1);
else
sb.append(1);
sb.append("\n");
}
System.out.println(sb);
}
}
플로이드 - 워셜 알고리즘과 다익스트라 알고리즘은 이제 사용이 익숙한데, 벨만-포드 알고리즘에 대해서는 아직 이해가 많이 부족하다. 곧 벨만-포드 알고리즘 문제인 웜홀도 풀어 볼 예정이다. solved.ac 클래스 4에도 내장되어 있는 문제로, 그만큼 중요도가 높은 문제인 것 같다.
하루에 백준 1문제 이상 푸는 것을 목표로 하고 있다.
https://solved.ac/profile/anwlro0212