4개의 댓글이 있습니다.
-
-
VOCList -
힌트
아마 모든 경로를 만들어본다는 아이디어가 TLE를 일으키는 원인일 것 같습니다.
예를 들자면, 시작점이 0 도착점이 101번 노드이며 0 -> 1 ~ 10 노드에 엣지가 하나씩(총 열개), 1 ~ 10 -> 11 ~ 20 에 각각 엣지가 하나씩(총 백개), 11 ~ 20 -> 21 ~ 30 에 각각 하나씩(총 백개), ....
, 그리고 마지막으로 91 ~ 100 -> 101에 엣지가 하나씩(총 10개) 그려진 그래프를 생각해보면(모든 엣지의 가중치는 1), 최단경로의 갯수는 1 ~ 10에서 하나를 선택, 11 ~ 20에서 하나를 선택 ... 와 같은 방식이 되어 10 ^ 10 개가 나오게 됩니다.모든 길을 생성해보는 궁극적인 이유는 각각 노드의 등장 빈도를 세기 위해서이지요. 등장 빈도를 좀 더 효과적으로 세어볼 수 있으면 해결할 수 있지 않을까요.
12년 전 link
-
-
정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.
kwangswei
으으으으, 3일간 고민하다가 결국에는 또 질문 게시판에 글을 쓰네요 ㅠ.ㅠ
AVOID 문제입니다.
오답이 나오는데요. 부분이 잘못 되었는지 검토 부탁 드립니다.
알고리즘.
1. 다익스트라 알고리즘을 이용해서 시작점부터 끝점까지의 최단 경로를 구합니다.
1.1. 이 때 Parent 에 부모 노드를 저장합니다.
1.2. 최단 경로가 갱신되면 parent 를 비운 뒤 노드를 저장하고,
1.3. 최단 경로와 같은 cost 의 경로가 발견되어도 parent 에 저장합니다.
2. 다익스트라 알고리즘이 끝나면 parent 를 통해서 가능한 모든 경로 리스트를 구합니다.
2.1. 무식하게 재귀로 모든 경로 생성하도록 했습니다.
3. 모든 경로 리스트에서 각 노드의 빈도를 누적하여 확률을 계산합니다.
첫번째 예제를 예로 들면,
다익스트라 알고리즘을 끝내고 나면 parent 에는 다음과 같습니다.
1 - X
2 - 1
3 - 1
4 - 2, 3
그럼 위의 parent list 를 가지고 모든 가능한 경로를 생성합니다.
allpath(4) = allpath(2)+allpath(3) 에 각각 "4" 를 붙인 경로.
allpath(2) = allpath(1) 에 "2" 를 붙인 경로......
최종적으로
1-2-4
1-3-4
가 도출 됩니다.
그럼 빈도를 누적하여 최종적으로 결과를 냅니다.
1 : 2 = 2/2 = 1/1
2 : 1 = 1/2
3 : 1 = 1/2
4 : 2 = 2/2 = 1/1
중간에 테스트 코드 삽입하여 모든 경로 제대로 생성하는 지
확인하였는데 문제가 없어 보입니다...
0 : 1 3 4
1 : 1 2 4
1/2
1/1
0 : 1 4 6 8
1 : 1 3 4 6 8
2 : 1 2 4 6 8
3 : 1 4 5 8
4 : 1 3 4 5 8
5 : 1 2 4 5 8
1/3
1/1
1/2
0/1
0 : 1 3 6 8 9 10
1 : 1 2 5 7 9 10
2 : 1 2 4 7 9 10
2/3
1/3
1/3
1/1
조언 부탁 드립니다.
12년 전