BOJ 1167 트리의 지름


https://www.acmicpc.net/problem/1167


트리, DFS


난이도 MH




트리의 지름이란?

트리의 한 정점(V1)에서 다른 정점(V2) 까지의 거리가 제일 큰 것을 트리의 정점이라 한다.


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

아무 정점이나 하나 골라서 가장 거리가 먼 V1을 찾고

그 V1을 이용해 가장 거리가 먼 V2를 찾아 길이를 구하면 트리의 지름이 된다.


#define _CRT_SECURE_NO_WARNINGS 

#include 
#include 
#include 
#include 

using namespace std;

#define MAX_N 100000

int N, A, B, V;

typedef pair PAIR;
vector > input;
bool v1[MAX_N + 1];
bool v2[MAX_N + 1];

PAIR longest(int v, bool* visited)
{
	visited[v] = true;

	PAIR ret = make_pair(0, 0);

	for (int i = 0; i < input[v].size(); i++)
	{
		if (!visited[input[v][i].first])
		{
			PAIR p = longest(input[v][i].first, visited);

			if (ret.second < input[v][i].second + p.second)
			{
				ret.second = input[v][i].second + p.second;
				ret.first = p.first;
			}
		}
	}

	if (ret.first == 0)
		return make_pair(v, 0);
	return ret;
}

int main(int argc, char** argv)
{
#ifdef _WIN32
	freopen("Text.txt", "r", stdin);
#endif

	scanf("%d", &N);

	input = vector >(N + 1);

	for (int i = 1; i <= N; i++)
	{
		scanf("%d", &V);

		while (true)
		{
			scanf("%d", &A);

			if (A == -1)
				break;

			scanf("%d", &B);

			input[V].push_back(make_pair(A, B));
		}

	}

	PAIR p1 = longest(1, v1);
	PAIR p2 = longest(p1.first, v2);
	printf("%d", p2.second);

	return 0;
}



'컴퓨터공학 > Program Solving' 카테고리의 다른 글

BOJ 1080 행렬  (0) 2017.01.30
이분 그래프  (0) 2017.01.16
BOJ 1890 점프  (0) 2017.01.04
BOJ 11404 플로이드  (0) 2017.01.03
BOJ 2096 내려가기  (0) 2016.12.04

[Largest Rectangle in Histogram]

https://leetcode.com/problems/largest-rectangle-in-histogram/


stack을 이용해 O(n) 시간에 구할 수 있다.


height = [2,1,5,6,2,3]


아래와 같은 Histogram이 입력으로 들어온다고 가정하자.


모든 height를 방문하면서 stack에 집어 넣는데, 규칙은 다음과 같다.


현재 반복문의 인덱스를 i라고 할 때,

height[i] <= height[stack.top()] 인 모든 경우에 대하여

stack.pop()을 한 후, 사각형의 넓이를 계산하는 과정을 수행한다.


아래 그림에서 회색 음영의 사각형은 현재 stack에 추가되는 사각형을 의미한다.

점선 테두리의 사각형은 stack에서 pop 되는 사각형이고, 노란색 음영의 사각형은 이 떄 계산하는 사각형의 넓이를 의미한다.






모든 사각형이 stack에 추가되었을 때, stack에 남아 있는 사각형의 넓이를 계산할 수 없다. 따라서, height 배열의 마지막에 0 을 추가한 후, 반복문 순회를 시작해야 한다. 그러면 마지막에 남은 사각형의 넓이를 계산할 수 있다.






[Maximal Rectangle]

https://leetcode.com/problems/maximal-rectangle/


[Largest Rectangle in Histogram] 문제의 응용 버전이다.

입력으로 받은 큰 사각형에서 반복문을 통해 각 row마다 높이를 계산하는 작업을 전처리한 후, 각 row마다 [Largest Rectangle in Histogram] 문제처럼 stack을 이용한 sweeping 작업을 수행한다.

O(n^2) 의 시간이 걸린다.



DP로 문제를 푸는 방법은 답이 생각나지 않아서 해결하지 못했다.


[Maximal Square]

https://leetcode.com/problems/maximal-square/


[Maximal Rectangle]문제의 하위 버전이다.

DP를 이용하여 쉽게 풀 수 있다.



[Path Sum]

https://leetcode.com/problems/path-sum/

[Path Sum 2]

https://leetcode.com/problems/path-sum-ii/

[Binary Tree Paths]

https://leetcode.com/problems/binary-tree-paths/


모두 stack을 이용하여 풀 수 있다.

'컴퓨터공학 > Program Solving' 카테고리의 다른 글

[Leetcode]160307  (0) 2016.03.07
[Leetcode] 160302  (0) 2016.03.02
[leetcode] 160229  (0) 2016.02.29
[leetcode]160225  (0) 2016.02.25
[leetcode.com] 160224  (0) 2016.02.24

[Symmetric Tree]

https://leetcode.com/problems/symmetric-tree/

DFS



[Minimum Depth of Binary Tree]

https://leetcode.com/problems/minimum-depth-of-binary-tree/


DFS로 구현, BFS로도 구현 가능



[Excel Sheet Column Number]

https://leetcode.com/problems/excel-sheet-column-number/


math

'컴퓨터공학 > Program Solving' 카테고리의 다른 글

[Leetcode] 160302  (0) 2016.03.02
[Leetcode] 160301  (0) 2016.03.02
[leetcode] 160229  (0) 2016.02.29
[leetcode]160225  (0) 2016.02.25
[leetcode.com] 160223  (0) 2016.02.23

[Palindrome Partitioning]

https://leetcode.com/problems/palindrome-partitioning/


def dfs(sublist, str)

if not str

ret += sublist

else

for str의 0번 인덱스 시작 길이가 1부터 len(str)까지의 모든 substring

if substring is palindrome

dfs(sublist += substring, str에서 substring을 제외한 나머지)



[Binary Tree Preorder, Inorder, Postorder]


https://leetcode.com/problems/binary-tree-preorder-traversal/

https://leetcode.com/problems/binary-tree-inorder-traversal/

https://leetcode.com/problems/binary-tree-postorder-traversal/


stack, hash

reverse(preorder) = postorder

'컴퓨터공학 > Program Solving' 카테고리의 다른 글

[Leetcode] 160302  (0) 2016.03.02
[Leetcode] 160301  (0) 2016.03.02
[leetcode] 160229  (0) 2016.02.29
[leetcode]160225  (0) 2016.02.25
[leetcode.com] 160224  (0) 2016.02.24

+ Recent posts