※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 16021번 문제인 Choose your own path이다.
문제는 아래 링크를 확인하자.

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

 

각 책 페이지를 정점으로, 한 페이지에서 다른 페이지로 이동할 수 있는 관계를 에지로 하는 그래프로 문제를 모델링하자. 이 때, 구성한 그래프에서 첫 페이지를 나타내는 정점에서 출발해 도달할 수 있는 모든 다른 정점까지의 최단거리는 bfs를 통해 간단히 구할 수 있다.

 

모든 정점이 도달할 수 있는 정점인지, 그리고 도달할 수 있는 모든 엔딩 페이지에 대하여 첫 페이지와 가장 가까운 정점(항상 존재함을 문제의 조건이 보장한다.)의 거리를 bfs의 결과를 통해 구하고 문제를 해결하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

int N, K;
vector<int> E, G[10001];
int dist[10001];
queue<int> que;
int mn = 1000000007;
bool chk = 1;

void bfs() {
	dist[1] = 1;
	que.push(1);
	while (!que.empty()) {
		int cur = que.front(); que.pop();
		for (auto &nxt:G[cur]) {
			if (!dist[nxt]) que.push(nxt), dist[nxt] = dist[cur] + 1;
		}
	}
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> N;
	for (int i = 1; i <= N; i++) {
		cin >> K;
		if (!K) E.emplace_back(i);
		else {
			while (K--) {
				int x; cin >> x;
				G[i].emplace_back(x);
			}
		}
	}

	bfs();
	for (int i = 1; i <= N; i++) {
		if (!dist[i]) chk = 0;
	}
	if (chk) cout << "Y\n";
	else cout << "N\n";
	for (auto &x:E) {
		if (!dist[x]) continue;
		mn = min(mn, dist[x]);
	}

	cout << mn;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 20104 // C++] Timecard  (1) 2024.10.28
[BOJ 2014 // C++] 소수의 곱  (1) 2024.10.25
[BOJ 32383 // C++] 점프  (2) 2024.10.23
[BOJ 6248 // C++] Bronze Cow Party  (1) 2024.10.22
[BOJ 5526 // C++] ダーツ (Darts)  (2) 2024.10.21

+ Recent posts