문제:
풀이 방법:
<Test 32 시간초과>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
def delivery(stack,dist,now,roads,K):
for r in roads[now]:
temp=dist+r[1]
if not r[0] in stack and temp <=K:
stack.append(r[0])
count.add(r[0])
delivery(stack,temp,r[0],roads,K)
stack.pop()
def solution(N,road,K):
roads=[[]for i in range(N+1)]
for i in range(len(road)):
if not road[i][0] in roads[road[i][1]]:
roads[road[i][1]].append((road[i][0],road[i][2]))
if not road[i][1] in roads[road[i][0]]:
roads[road[i][0]].append((road[i][1],road[i][2]))
stack=[1]
dist=0
global count
count=set(stack)
for r in roads[1]:
temp=dist+r[1]
if not r[0] in stack and temp <=K:
stack.append(r[0])
count.add(r[0])
delivery(stack,temp,r[0],roads,K)
stack.pop()
return len(count)
|
cs |
<2021.07.11 수정>
DFS와 같이 재귀적인 방법을 사용하는 것이 시간을 많이 소요할 것 같아 일반적으로 그래프에서 최소 거리를 구하는 방법으로 많이 사용되는 다익스트라 방법을 사용했다. 1에서 부터의 거리를 측정하기 때문에, 1에서 다익스트라로 거리를 구한 뒤에 K보다 작은 것의 갯수를 세서 반환하도록 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
import heapq
def dijkstra(start,dp,edge):
dp[start] = 0
heapq.heappush(heap,(0,start))
while heap:
weight, move = heapq.heappop(heap)
if dp[move] < weight:
continue
for w, node in edge[move]:
if w+weight< dp[node]:
dp[node] = w+weight
heapq.heappush(heap,(dp[node],node))
return dp
def solution(N,road,K):
edge = [[] for _ in range(N+1)]
heap = []
for i in road:
a,b,c = i
edge[a].append((c,b))
edge[b].append((c,a))
dp = [float('inf')]*(N+1)
dp = dijkstra(1,dp,edge)
answer = 0
for i in range(1,V+1):
if dp[i] <= K:
answer +=1
return answer
|
cs |
문제 링크:
'Algorithm > Python' 카테고리의 다른 글
[BOJ]15649. N과M(1),(2) (0) | 2019.08.02 |
---|---|
[BOJ]1009. 분산처리 (0) | 2019.08.01 |
[Programmers]Lv 3. 순위 (0) | 2019.07.30 |
[Programmers]Lv3. 가장 먼 노드 (0) | 2019.07.29 |
[Programmers]Lv 4. 3xn 타일링 (2) | 2019.07.28 |