https://www.acmicpc.net/problem/1967
입력으로 트리가 주어지면 트리의 지름(트리에서 임의의 두 점 사이의 거리 중 가장 긴 것)을 구하는 문제다.
트리의 지름을 구하는 방법은 다음과 같다.
1. 임의의 노드 u에서 가장 먼 노드 v를 찾는다.
2. 노드 v에서 다시 가장 먼 노드 w를 찾는다.
3. v와 w 사이의 거리가 트리의 지름이 된다.
위 방법을 바탕으로 BFS를 사용하여 트리의 지름을 구한다.
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
pair<int, int> bfs(int n, vector<vector<pair<int, int>>> adj){
pair<int, int> distant;
queue<pair<int, int>> q;
bool visited[adj.size()]={0};
q.emplace(n,0);
visited[n]=true;
while(!q.empty()){
int curN=q.front().first;
int curD=q.front().second;
if(distant.second < curD) distant={curN, curD};
q.pop();
for(int i=0; i<adj[curN].size(); i++){
int nextN=adj[curN][i].first;
int nextD=curD+adj[curN][i].second;
if(!visited[nextN]){
q.emplace(nextN, nextD);
visited[nextN]=true;
}
}
}
return distant;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int n, v1, v2, w;
cin >> n;
vector<vector<pair<int, int>>> adj(n+1);
for(int i=0; i<n-1; i++){
cin >> v1 >> v2 >> w;
adj[v1].emplace_back(v2, w);
adj[v2].emplace_back(v1, w);
}
pair<int, int> node1 = bfs(1, adj);
pair<int, int> node2 = bfs(node1.first, adj);
cout << node2.second;
return 0;
}
입력을 받아 인접행렬을 만들때 pair<노드번호, 가중치> 형식을 사용했다.
bfs 함수도 노드번호와 거리를 반환하게 하여 두번의 bfs를 돌려 답을 구한다.
'코딩 테스트 > 백준' 카테고리의 다른 글
백준 11404 플로이드 (1) | 2024.11.08 |
---|---|
백준 30804번 과일 탕후루 (0) | 2024.10.29 |
백준 16928번 뱀과 사다리 게임 (0) | 2024.10.28 |
백준 1197번 최소 스패닝 트리 (0) | 2024.09.21 |
백준 2467번 용액 (0) | 2024.09.21 |