코드
#include <iostream>
#include <vector>
#include <algorithm>
#include <string.h>
using namespace std;
bool visited[100001];
vector<pair<int, int> > v[100001];
int V;
int n[100001];
int maxx;
int last;
void dfs(int a, int leng){
visited[a] = true;
bool chk = false;
for(int i = 0; i < v[a].size(); i++){
if(!visited[v[a][i].first]){
chk = true;
}
}
if(!chk){
if(leng > maxx){
maxx = leng;
last = a;
}
return;
}
for(int i = 0; i < v[a].size(); i++){
if(!visited[v[a][i].first]){
visited[v[a][i].first] = true;
dfs(v[a][i].first, leng+v[a][i].second);
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> V;
for(int i = 0; i < V; i++){
cin >> n[i];
int a, b;
while(true){
cin >> a;
if(a == -1)break;
cin >> b;
v[n[i]].push_back(make_pair(a, b));
}
}
dfs(n[0], 0);
memset(visited, 0, 100001*sizeof(bool));
dfs(last, 0);
cout << maxx;
return 0;
}
알게된 점
처음엔 모든 노드에서 dfs돌려서 했는데 시간초과가 나왔다.
트리의 지름을 구하는 방법은
아무점에서 최고로 먼 점을 찾는다
그리고 그 점에서 최고로 먼점을 찾으면 트리의 지름이 나온다!
알아두어야겠다..
'하루하나코딩' 카테고리의 다른 글
프로그래머스 : 배열의 유사도 c++ (1) | 2023.04.15 |
---|---|
프로그래머스 : 모음제거 c++ (0) | 2023.04.15 |
백준 1149 : RGB거리 c++ (1) | 2023.04.14 |
백준 1043 : 거짓말 c++ (0) | 2023.04.13 |
백준 1927 : 최소 힙 c++ (0) | 2023.04.12 |