문제링크 : https://www.acmicpc.net/problem/1167
1167번: 트리의 지름
트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;
vector<pii>vec[100001];
bool visited[100001];
int result, target;
void dfs(int idx, int dist)
{
visited[idx] = 1;
if(result < dist)
{
result = dist; //가장 먼 거리 저장
target = idx; //가장 먼 지점 저장
}
for(int i=0; i<vec[idx].size(); i++)
{
auto[next, ncost] = vec[idx][i];
if(visited[next]) continue;
dfs(next, ncost + dist);
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int N;
cin >> N;
for(int i=0; i<N-1; i++)
{
int u, v, cost; //부모, 자식, 가중치
cin >> u;
while(1)
{
cin >> v;
if(v==-1) break; //-1을 입력해야 입력 종료
cin >> cost;
vec[u].push_back({v, cost});
vec[v].push_back({u, cost});
}
}
dfs(1, 0); //가장 먼 위치 구하기
memset(visited, 0, sizeof(visited)); //재탐색을 위해 초기화
dfs(target, 0); //가장 먼 위치에 대해 가장 먼 거리 구하기 (지름 구하기)
cout <<result;
return 0;
}
1967번 문제와 입력 케이스만 다를 뿐 거의 유사한 문제인 것 같다.
1967번 문제의 난이도 기여 탭을 보니 1167번 문제와 사실상 똑같다고 하는 말들이 제법 많이 보여서 봤더니 확실히 거의 동일한 답안으로 정답이 가능했다.
가장 다른 점은 N의 범위이다.
1967번이 N의 범위가 훨씬 적어서 N^2의 풀이가 가능하므로 골드4고 1167번은 N^2풀이가 불가능하여 dfs()를 2번 돌려야하는 풀이를 떠올려야 하는에 이게 쉽지 않기 때문에 골드2인 것 같다.
풀이는 1167번 문제 풀이를 참고하면 된다.
https://blob-thinking.tistory.com/231
[백준 1967번] 트리의 지름 (C++)
문제링크 : https://www.acmicpc.net/problem/1967 1967번: 트리의 지름 파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n-1개의 줄에 각 간선에 대한 정보가 들어온다. 간선에 대한 정보
blob-thinking.tistory.com
'백준 > 골드' 카테고리의 다른 글
[백준 14938번] 서강그라운드 (C++) (0) | 2023.08.08 |
---|---|
[백준 2448번] 별 찍기 - 11 (C++) (0) | 2023.08.07 |
[백준 1967번] 트리의 지름 (C++) (0) | 2023.08.05 |
[백준 16973번] 직사각형 탈출 (C++) (0) | 2023.07.29 |
[백준 2589번] 보물섬 (C++) (0) | 2023.07.27 |