※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 14699번 문제인 관악산 등산이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/14699
14699번: 관악산 등산
서울대학교에는 “누가 조국의 미래를 묻거든 고개를 들어 관악을 보게 하라”라는 유명한 문구가 있다. 어느 날 Unused는 Corea에게 조국의 미래를 물었고, Corea는 직접 관악산에 올라가 조국의 미
www.acmicpc.net
각 쉼터의 가능한 경로의 길이의 최댓값은 연결된 길을 따라 더 높은 다음 쉼터로 올라갔을 때의 (각 쉼터에서의 가능한 경로의 길이 최댓값+1)들 중 최댓값이 된다. 이것을 쉽게 구하는 방법으로 위상정렬이 있다.
주어지는 쉼터들을 노드로, 산책로를 더 높은 위치의 심터에서 낮은 위치의 쉼터로 향하는 directed edge로 표현하면 DAG를 하나 얻을 수 있다. 이 그래프에서 위상정렬 순으로 각 노드에서 출발해 거칠 수 있는 쉼터의 개수의 최댓값을 갱신해나가자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int N, M;
vector<int> G[5001];
int H[5001];
int indegree[5001];
queue<int> que;
int ans[5001];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> M;
for (int i = 1; i <= N; i++)cin >> H[i];
while (M--) {
int x, y; cin >> x >> y;
if (H[x] < H[y]) G[y].emplace_back(x), indegree[x]++;
else G[x].emplace_back(y), indegree[y]++;
}
for (int i = 1; i <= N; i++) {
if (indegree[i] == 0) que.push(i);
}
while (!que.empty()) {
int x = que.front(); que.pop();
ans[x]++;
for (auto node : G[x]) {
ans[node] = max(ans[node], ans[x]);
indegree[node]--;
if (indegree[node] == 0) que.push(node);
}
}
for (int i = 1; i <= N; i++) cout << ans[i] << '\n';
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 23251 // C++] 스물셋 (0) | 2022.07.03 |
---|---|
[BOJ 23252 // C++] 블록 (0) | 2022.07.03 |
[BOJ 14715 // C++] 전생했더니 슬라임 연구자였던 건에 대하여 (Easy) (0) | 2022.07.03 |
[BOJ 14711 // C++] 타일 뒤집기 (Easy) (0) | 2022.07.02 |
[BOJ 14709 // C++] 여우 사인 (0) | 2022.07.01 |