하루하나코딩

백준 1167 : 트리의 지름 c++

HAHAKO 2023. 4. 14. 01:58

코드

#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돌려서 했는데 시간초과가 나왔다.

트리의 지름을 구하는 방법은

아무점에서 최고로 먼 점을 찾는다

그리고 그 점에서 최고로 먼점을 찾으면 트리의 지름이 나온다!

알아두어야겠다..