fragment-header
fragment-markdown
홈
로그인
로그아웃
내 블로그
설정
로그인
백준 14699 (C++) 관악산 등산
최초 업로드: 2025-07-20 01:45:08
최근 수정 시간: 2025-07-25 08:43:16
게시자: rlatjwls3333
카테고리: 백준
조회수: 7
# [Gold IV] 관악산 등산 [문제 링크](https://www.acmicpc.net/problem/14699) ## 문제 설명 <p>서울대학교에는 “누가 조국의 미래를 묻거든 고개를 들어 관악을 보게 하라”라는 유명한 문구가 있다. 어느 날 Unused는 Corea에게 조국의 미래를 물었고, Corea는 직접 관악산에 올라가 조국의 미래를 보고 답해 주기로 했다.</p> <p>관악산의 등산로는 1부터 N까지의 서로 다른 번호가 붙어 있는 N개의 쉼터와 두 쉼터 사이를 오갈 수 있는 M개의 길들로 이루어져 있다. Corea는 지면에서부터 산을 오르는 것은 너무 귀찮다고 생각했기 때문에, 케이블카를 타고 임의의 쉼터에서 내린 다음 등산을 시작하기로 했다. Corea는 항상 더 높은 곳을 지향하기 때문에, 쉼터에 도착하면 그 쉼터와 직접 연결된 더 높은 쉼터로 향하는 길들 중 하나를 골라서 그 길을 따라 이동한다. 만약 그런 길이 없다면 등산을 마친다.</p> <p>관악산의 쉼터들에는 조국의 미래를 볼 수 있는 전망대가 하나씩 설치되어 있다. Corea는 최대한 많은 쉼터를 방문해서 조국의 미래를 많이 보고 Unused에게 전해 주기로 했다. 관악산의 지도가 주어질 때, Corea가 각각의 쉼터에서 출발해서 산을 오를 때 최대 몇 개의 쉼터를 방문할 수 있는지 구하여라.</p> ## 입력 <p>첫 번째 줄에 등산로에 있는 쉼터의 수 N(2 ≤ N ≤ 5, 000)과 두 쉼터 사이를 연결하는 길의 수 M(1 ≤ M ≤ 100, 000)이 주어진다.</p> <p>두 번째 줄에는 각 쉼터의 높이를 나타내는 N개의 정수가 번호 순서대로 주어진다. 각 쉼터의 높이는 1 이상 1, 000, 000 이하이며 서로 다르다.</p> <p>세 번째 줄부터 M개의 줄에 걸쳐 각각의 길이 연결하는 두 쉼터의 번호가 공백으로 구분되어 주어진다. 쉼터의 번호는 1 이상 N 이하의 정수이다. 양 끝점이 같은 쉼터인 길은 없으며, 임의의 두 쉼터를 연결하는 길이 여러 개 존재할 수 있다.</p> ## 출력 <p>N개의 줄에 걸쳐 n번째 줄에 Corea가 n번 쉼터에서 출발해서 산을 오를 때 최대로 방문할 수 있는 쉼터의 개수를 출력한다.</p> ## 풀이 #### 매번 dfs해서 최대 높이를 찾아주면 된다. ``` c++ #include<bits/stdc++.h> using namespace std; const int MAX = 5001; int h[MAX], depth[MAX]; vector<vector<int>> conn(MAX); int dfs(int cur) { if(depth[cur]) return depth[cur]; if(conn[cur].empty()) return depth[cur]=1; for(int next:conn[cur]) { depth[cur] = max(depth[cur], dfs(next)+1); } return depth[cur]; } int main() { ios::sync_with_stdio(0); cin.tie(0); int n, m; cin >> n >> m; for(int i=1;i<=n;i++) cin >> h[i]; while(m--) { int u, v; cin >> u >> v; if(h[u]<h[v]) conn[u].push_back(v); else if(h[u]>h[v]) conn[v].push_back(u); } for(int i=1;i<=n;i++) { memset(depth, 0, sizeof depth); cout << dfs(i) << '\n'; } } ```