본문 바로가기
알고리즘 문제풀이/백준문제풀이

[백준문제풀이] 1167 트리의 지름

by 로디네로 2021. 1. 4.
반응형

 

풀이일시 : 2020-12-28

 

 

문제 : 

트리의 지름이란, 트리에서 임의의 두 점 사이의 거리 중 가장 긴 것을 말한다. 트리의 지름을 구하는 프로그램을 작성하시오.

 

 

입력 : 

트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2≤V≤100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. (정점 번호는 1부터 V까지 매겨져 있다고 생각한다)

먼저 정점 번호가 주어지고, 이어서 연결된 간선의 정보를 의미하는 정수가 두 개씩 주어지는데, 하나는 정점번호, 다른 하나는 그 정점까지의 거리이다. 예를 들어 네 번째 줄의 경우 정점 3은 정점 1과 거리가 2인 간선으로 연결되어 있고, 정점 4와는 거리가 3인 간선으로 연결되어 있는 것을 보여준다. 각 줄의 마지막에는 -1이 입력으로 주어진다. 주어지는 거리는 모두 10,000 이하의 자연수이다.

ex)

5

1 3 2 -1

2 4 4 -1

3 1 2 4 3 -1

4 2 4 3 3 5 6 -1

5 4 6 -1

 

 

출력 : 

첫째 줄에 트리의 지름을 출력한다.

ex)

11

 

 

풀이 : 

섵불리 풀기 시작하면 시간을 허비할 가능성이 있다.

 

트리의 지름을 구하는 방법을 생각해 보는 것도 좋지만 정형화된 방법이 있기 때문에 참고하기 바란다.

 

> 다른분 블로그 포스팅을 가져왔다..

blog.myungwoo.kr/112

 

트리의 지름 구하기

트리에서 지름이란, 가장 먼 두 정점 사이의 거리 혹은 가장 먼 두 정점을 연결하는 경로를 의미한다. 선형 시간안에 트리에서 지름을 구하는 방법은 다음과 같다: 1. 트리에서 임의의 정점 $x$를

blog.myungwoo.kr

이러한 공식만 알고 풀게되면 DFS로 쉽게 풀이할 수 있다.

 

//트리의 지름을 먼저 구해보자
//정점 1에서 시작해서 가장 먼 거리를 y 정점이라고 하자
//이 y정점에서 가장 먼저리인 z가 있다 y-z가 가장 긴 거리이다.

#include <iostream>
#include <vector>
#include <string.h>
using namespace std;

int V;
const int MAX = 100001;
vector <pair<int, int>>v[MAX];
int visited[MAX] = { 0, };
int maxdist = 0;
int maxnode;

void input() {
	cin >> V;
	for (int i = 0; i < V; i++) {
		int num, n1, n2;
		cin >> num;
		cin >> n1;
		while (n1 != -1) {
			cin >> n2;
			v[num].push_back({ n1,n2 });
			v[n1].push_back({ num,n2 });
			cin >> n1;
		}
	}
}

void dfs(int i,int dist) {
	if (visited[i]) //방문한거면 다시방문X
		return;
	if (maxdist < dist) { //갱신해나가는과정
		maxdist = dist;
		maxnode = i;
	}
	visited[i] = true;
	for (int j = 0; j < v[i].size(); j++) {
		int ni = v[i][j].first;
		int nd = v[i][j].second;
		dfs(ni, nd + dist);
	}
}

int main() {
	input();
	dfs(1,0);//1정점에서 시작한다. distance=0으로 들어갈것 maxnode를 구해야된다.
	memset(visited, false, sizeof(visited));
	maxdist = 0;
	dfs(maxnode, 0);//찾은 그 노드에서 가장먼것을 찾는다.
	cout << maxdist;
	return 0;
}

 

참고자료 : memset

dbstndi6316.tistory.com/28

 

[개념정리] memset함수

메모리를 조작하는 함수로는 대표적으로 memset, memcpy, memmove, memcmp 등이 있다. 그 중 메모리를 초기화하는 memset을 알아본다. ​ memset함수란 메모리의 내용을 원하는 크기만큼 특정 값으로 세팅할

dbstndi6316.tistory.com

참고자료 : DFS

dbstndi6316.tistory.com/64

 

[기본문제풀이] DFS 깊이우선탐색

풀이일시 : 2020-08-30 ​ DFS : 깊이우선탐색으로 DFS보다 좁고 깊게 탐색해나가며 전체 정점을 탐색하는 방법이다. 주로 stack을 이용한다. 아래그림이 dfs를 한눈에 보여준다고 생각한다 출처 : http://

dbstndi6316.tistory.com

참고자료 : vector

dbstndi6316.tistory.com/25

 

[개념정리] vector container

vector 란 C++ STL vector는 list계열의 container 종류이다. 자료구조의 스택과 구조가 비슷하다. vector를 생성하면 메모리 heap에 생성되며 동적할당 된다. ​ vector 사용 선언 및 초기화 vector<자료형> 변수.

dbstndi6316.tistory.com

 

반응형

댓글