lgun202   2년 전

안녕하세요. 여러 해설을 찾다보니 쉽게 푸는 정답을 알긴했는데

이 방식으로는 계속 왜 6%에서 틀렸다고 나오는지 궁금해서 질문 글을 올립니다.

답변해주시면 정말로 진심으로 감사드리겠습니다.

먼저 트리를 입력 받을 때 정점이 작은 순(위에서부터)부터 입력 되기 때문에 입력을 하면서

ist[i][v] = dist[i][u] + dist[u][v]; 이런식으로 정점 1에서 모든 정점으로의 길이, 정점 2에서 모든 정점으로의 길이 등을 다 저장해주었습니다.

그런다음 childNode의 개수도 같이 카운트해주어서 leafNode를 따로 List에 저장해주었습니다.

그리고 입력을 받으면서 각 정점에다가 각 정점의 부모노드로 뭐가 있는지도 저장해주었습니다.

ex) 문제 테스트케이스

1의 부모노드로는 있습니다.
2의 부모노드로는 1 있습니다.
3의 부모노드로는 1 있습니다.
4의 부모노드로는 1 2 있습니다.
5의 부모노드로는 1 3 있습니다.
6의 부모노드로는 1 3 있습니다.
7의 부모노드로는 1 2 4 있습니다.
8의 부모노드로는 1 2 4 있습니다.
9의 부모노드로는 1 3 5 있습니다.
10의 부모노드로는 1 3 5 있습니다.
11의 부모노드로는 1 3 6 있습니다.
12의 부모노드로는 1 3 6 있습니다.

이런식으로 입니다.

그런다음 각 mid별로 dist[mid][leafNode] 반복시키면

mid: 1
edge value: 28, parents 3
edge value: 21, parents 3
edge value: 17, parents 3
edge value: 17, parents 3
edge value: 15, parents 2
edge value: 9, parents 2

mid: 2
edge value: 12, parents 4
edge value: 6, parents 4

mid: 3
edge value: 26, parents 5
edge value: 19, parents 6
edge value: 15, parents 5
edge value: 15, parents 6

mid: 4
edge value: 7, parents 0
edge value: 1, parents 0

mid: 5
edge value: 15, parents 0
edge value: 4, parents 0

mid: 6
edge value: 10, parents 0
edge value: 6, parents 0

이런식으로 각 mid에서 내림차순으로 (mid->리프노드) 의 (가중치 값, mid 바로 아래에 있는 child->parents라 표현) 값으로 정렬을 할 수 있습니다. 그런다음 parents 같으면 서로 간선이 겹치는 최댓값이 나오므로 간선이 겹치지 않는, mid바로 아래 child가 겹치지 않는 다른 상위 2개의 edge value를 더해줘서 구하면 길이 최댓값이 나온다고 생각했습니다.

그 외 편향트리인 경우, 위 리프노드의 부모가 mid가 되는 경우 parents가 0으로 뜨는 경우 모두 처리해주었습니다.

그래서 백준 질문 글에 나와있는 테스트 케이스들은 전부 맞았는데 바로 6%에서 틀려버리니 뭐가 완전히 잘못된 것 같습니다. 해당 부분 반례 찾아주시면 진심으로 감사드리겠습니다.

kopasd99   2년 전

크흠....

55murphy   2년 전

dist, isHasChild 자료형이 char이라서 정점 A에서 여러 정점들을 거쳐 점점 B까지의 거리가 char에 담을수 있는 값을 벗어나면 오답을 출력하는것 같아요

lgun202   2년 전

감사합니다. 덕분에 해당 문제점을 알고 기존의 인접행렬 dist를 map<short, int>를 이용한 인접리스트로 변경해서 데이터 크기를 최대한 절감하였지만 40% 부분에서 메모리초과가 뜨네요 :(

그래도 덕분에 뭐가 문제인지 알게되어서 속이 시원합니다 ㅎㅎ,,, 감사합니다!!

댓글을 작성하려면 로그인해야 합니다.