트리의 지름은 임의의 한 노드에서 다른 노드까지 거리를 구한 후 가징 멀리있는 노드에서 다시 모든 노드까지 거리를 구한후 가장 멀리 떨어져 있는 노드와의 거리가 지름이 된다.
http://blog.myungwoo.kr/112
여기에 증명이 잘 되어있다.
양방향 가중치 그래프로 만들고 dfs를 하면서 가장 멀리 떨어진 노드와 그 노드까지 거리를 구한다.
부모가 아닌지만 검사해 dfs 함수를 재귀적으로 호출하는 이유는 트리라서 싸이클이 없으니까 !
소스코드 :
#include <iostream>
#include <map>
#include <vector>
using namespace std;
vector<pair<int,int>> adj[100001];
int res,idx;
void dfs(int now,int parent, int len)
{
if(len>res) res=len,idx=now;
for(auto i=adj[now].begin(); i!=adj[now].end(); i++)
{
if(i->first != parent) dfs(i->first,now,len+i->second);
}
}
int main()
{
int n,dest,len,source;
cin>>n;
while(cin>>source>>dest>>len)
{
adj[source].push_back( pair<int,int>(dest,len));
adj[dest].push_back( pair<int,int>(source,len));
}
dfs(1,0,0);
dfs(idx,0,0);
cout<<res;
}
'알고리즘 > BOJ문제풀이' 카테고리의 다른 글
295번째 문제 - 1994 등차수열 (1) | 2016.12.28 |
---|---|
272번째 문제 - 2494 숫자 맞추기 (0) | 2016.12.22 |
217번째 문제 - 2306 유전자 (0) | 2016.12.14 |
대회 6 (0) | 2016.11.28 |
200번째 문제 - 13902 개업2 (0) | 2016.11.27 |