여행가자
백준 1976: 여행가자
풀이
연결 여부의 map 배열을 갱신시켜주어 map 배열만 보고 갈 수 있는지 판단.
예를 들어, 1에서 3으로 가고자하며 1과 2 연결, 2와 3이 연결 되어 있다고 하자.
그럼 (1,2)는 1이고 (1,3)은 0일 것이다. 1에서 2를 거쳐 3을 갈 수 있으니 결국 1에서 3으로 가는 것은 가능한 것. 따라서 (1,3)에도 1로 갱신을 해주자! 이때, (3,1)도 함께 1로 갱신.
소스코드
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt(); //도시의 수
int M = sc.nextInt(); //여행 계획의 도시의 수
int[][] map = new int[N+1][N+1]; //도시들 간의 연결 여부
for(int i=1; i<=N; i++) {
for(int j=1; j<=N; j++) {
map[i][j] = sc.nextInt();
}
}
int[] trip = new int[M]; //여행 계획
for(int i=0; i<M; i++)
trip[i] = sc.nextInt();
//map배열을 갱신(갈 수 있는 경로가 존재하면 1로 바꿈)
for(int i=1; i<=N; i++) {
for(int j=1; j<=N; j++) {
if(map[i][j]==1) {
for(int k=1; k<=N; k++) {
if(map[j][k]==1) {
map[i][k]=1;
map[k][i]=1;
}
}
}
}
}
for(int i=1; i<=N; i++)
map[i][i] =1; //자기 자신(도시)은 방문가능
//여행 계획대로 갈 수 있는지 판별
boolean flag = true;
int before = trip[0];
for(int i=1; i<M; i++) {
int after = trip[i];
if(map[before][after]==0) {
flag = false;
}
before = after;
}
if(flag)
System.out.println("YES");
else
System.out.println("NO");
}
}