![[APS][C++] BOJ G4 1976번 여행 가자](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbcpa3y%2FbtsNr9g9AdP%2FFuC82U38zwv4c5MA1Kf8W1%2Fimg.png)
[APS][C++] BOJ G4 1976번 여행 가자APS/BOJ2025. 4. 18. 19:30
Table of Contents
https://www.acmicpc.net/problem/1976
문제
동혁이는 친구들과 함께 여행을 가려고 한다. 한국에는 도시가 N개 있고 임의의 두 도시 사이에 길이 있을 수도, 없을 수도 있다. 동혁이의 여행 일정이 주어졌을 때, 이 여행 경로가 가능한 것인지 알아보자. 물론 중간에 다른 도시를 경유해서 여행을 할 수도 있다. 예를 들어 도시가 5개 있고, A-B, B-C, A-D, B-D, E-A의 길이 있고, 동혁이의 여행 계획이 E C B C D 라면 E-A-B-C-B-C-B-D라는 여행경로를 통해 목적을 달성할 수 있다.
도시들의 개수와 도시들 간의 연결 여부가 주어져 있고, 동혁이의 여행 계획에 속한 도시들이 순서대로 주어졌을 때 가능한지 여부를 판별하는 프로그램을 작성하시오. 같은 도시를 여러 번 방문하는 것도 가능하다.
입력
- 첫 줄에 도시의 수 N이 주어진다. N은 200이하이다.
- 둘째 줄에 여행 계획에 속한 도시들의 수 M이 주어진다. M은 1000이하이다.
- 다음 N개의 줄에는 N개의 정수가 주어진다.
- i번째 줄의 j번째 수는 i번 도시와 j번 도시의 연결 정보를 의미한다.
- 1이면 연결된 것이고 0이면 연결이 되지 않은 것이다.
- A와 B가 연결되었으면 B와 A도 연결되어 있다.
- 마지막 줄에는 여행 계획이 주어진다. 도시의 번호는 1부터 N까지 차례대로 매겨져 있다.
출력
- 첫 줄에 가능하면 YES 불가능하면 NO를 출력한다.
풀이
- 그래프 탐색 알고리즘 (BFS or DFS) 이용
- 시작 도시에서부터 다른 도시가 연결되어 있는지 여부를 확인
- 서로소 집합 자료구조 사용
- 여행 계획에 포함된 모든 도시들이 모두 같은 연결 요소(같은 집합 = 같은 root 노드)에 속하는지 판단
코드
그래프 탐색 알고리즘 (BFS) 풀이 코드
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
vector<vector<int>> map;
vector<int> visited;
void bfs(int start) {
queue<int> que;
que.push(start);
visited[start] = 1;
while (!que.empty()) {
int now = que.front();
que.pop();
for (int i = 1; i < map[now].size(); i++) {
if (map[now][i] == 0) continue;
int next = i;
if (visited[next] == 1) continue;
visited[next] = 1;
que.push(next);
}
}
}
int main() {
int n, m;
cin >> n >> m;
map.resize(n + 1, vector<int>(n + 1, 0));
visited.resize(n + 1, 0);
for (int i = 1; i < n + 1; i++) {
for (int j = 1; j < n + 1; j++) {
cin >> map[i][j];
}
}
vector<int> plan;
for (int i = 0; i < m; i++) {
int temp;
cin >> temp;
plan.push_back(temp);
}
bfs(plan[0]);
for (int i = 0; i < m; i++) {
if (visited[plan[i]] != 1) {
cout << "NO";
return 0;
}
}
cout << "YES";
return 0;
}
서로소 집합 자료구조 (Union-Find) 풀이 코드
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
vector<int> parent;
int Find(int n) {
// 대표가 자기 자신이면 반환
if (n == parent[n]) return n;
// root까지 갱신
parent[n] = Find(parent[n]);
return parent[n];
}
// 그룹 병합
void Union(int A, int B) {
int rootA = Find(A);
int rootB = Find(B);
if (rootA == rootB) return;
parent[rootB] = rootA;
}
int main() {
int n, m;
cin >> n >> m;
parent.resize(n + 1, 0);
for (int i = 1; i < n + 1; i++) {
parent[i] = i;
}
for (int i = 1; i < n + 1; i++) {
for (int j = 1; j < n + 1; j++) {
int temp;
cin >> temp;
if (temp == 1) {
Union(i, j);
}
}
}
int root = -1;
for (int i = 0; i < m; i++) {
int temp;
cin >> temp;
int temp_root = Find(temp);
if (root != -1 && root == temp_root)
continue;
else if (root == -1) {
root = temp_root;
} else {
cout << "NO";
return 0;
}
}
cout << "YES";
return 0;
}
결과
'APS > BOJ' 카테고리의 다른 글
[APS][C++] BOJ G2 16920번 확장 게임 (feat. 우선순위 큐) (0) | 2025.04.06 |
---|---|
[APS][C++] BOJ S3 9461번 파도반 수열 (feat. 다이나믹 프로그래밍, DP) (0) | 2025.03.28 |
[APS][C++] BOJ S1 2529번 부등호 (0) | 2025.03.12 |
[APS][C++] BOJ S5 11723번 집합 (feat. 입출력 시간 초과) (0) | 2025.02.16 |
[APS][C++] BOJ S5 1676번 팩토리얼 0의 개수 (feat. 0의 개수의 비밀) (0) | 2025.02.09 |
@청월누리 :: DevKuk 개발 블로그
since 2025.01.27. ~ 개발자를 향해....🔥