https://www.acmicpc.net/problem/1976
1976번: 여행 가자
동혁이는 친구들과 함께 여행을 가려고 한다. 한국에는 도시가 N개 있고 임의의 두 도시 사이에 길이 있을 수도, 없을 수도 있다. 동혁이의 여행 일정이 주어졌을 때, 이 여행 경로가 가능한 것인
www.acmicpc.net
한 그래프에 대해 여러 경로를 물어보는 문제이므로 플로이드-워셜 방식으로 풀 수 있다.
#include <cstdio>
#define MAX_N 200
int main () {
// map[i][j]: 도시 i에서 도시 j로 이동이 가능하다면 true, 아니라면 false
bool map[MAX_N][MAX_N] = {{ 0, }};
// N: 도시의 수, M: 여행 계획의 경로 길이
// from, to: 각 경로의 시작과 끝 도시
int N, M, from, to;
// 문제의 조건을 입력받은 뒤
scanf("%d %d", &N, &M);
for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) {
scanf("%d", &from);
map[i][j] = map[j][i] = from;
}
// 플로이드-워셜 기법을 이용해 각 도시가 연결되어 있는지 확인
for (int k = 0; k < N; k++) {
map[k][k] = true;
for (int i = 0; i < N; i++) for (int j = 0; j < N; j++)
map[i][j] |= map[i][k] && map[k][j];
}
// 여행을 시작할 도시를 입력받은 뒤
scanf("%d", &from);
// 각 경로에 대해
while (--M) {
// 경로의 끝 지점을 입력받고
scanf("%d", &to);
// from에서 to로 이동하는 경로가 없다면 NO를 출력하고 종료
if (!map[from - 1][to - 1]) break;
// 현재 경로의 끝을 다음 경로의 시작으로 지정
from = to;
}
// 이동 불가능한 경로가 있다면 M은 자연수가 되므로
// M에 따라 해당하는 답을 출력한 뒤 종료
return printf("%s\n", M ? "NO" : "YES") & 0;
}
'알고리즘 > 문제 풀이' 카테고리의 다른 글
백준 25215번: 타이핑 (0) | 2022.07.02 |
---|---|
백준 21820번: Acowdemia I (0) | 2022.07.01 |
백준 2317번: 결혼식 (0) | 2022.07.01 |
백준 5847번: Milk Scheduling (0) | 2022.06.30 |
백준 23358번: Quack Strikes Back (Easy) (0) | 2022.06.30 |