[BOJ] Q15591 MooTube

Question

Language: Python

Difficulty: Gold 5

bfs 순회를 통해 해당 노드까지 도달하기까지의 최소 유사도값(간선의 가중치)를 갱신하면서 해당 값이 k보다 큰 경우에 대해서 count값을 증가시킨다.

N-1 개의 간선을 가지는 트리 형태의 그래프이므로 cycle이 존재하지 않으므로 특정 노드와 노드를 잇는 경로는 유일하다.

#현재까지의 최소 유사도
vertex,cost=queue.popleft()
#다음 노드에 대한 순회
for adj_vertex,new_cost in graph[vertex]:
    #유사도값 갱신
    temp_cost=min(cost,new_cost)
    #만일 갱신된 최소 유사도값이 k이상이면 해당 노드로 순회 진행
    if not visited[adj_vertex] and temp_cost >=k:
        count+=1
        queue.append((adj_vertex,temp_cost))
        visited[adj_vertex]=True

Solution

from collections import deque
from math import inf
def bfs(start,k):
    visited=[False] * (n+1)
    visited[start]=True

    queue=deque([(start,inf)])
    count=0
    while queue:
        vertex,cost=queue.popleft()

        for adj_vertex,new_cost in graph[vertex]:
            temp_cost=min(cost,new_cost)
            if not visited[adj_vertex] and temp_cost >=k:
                count+=1
                queue.append((adj_vertex,temp_cost))
                visited[adj_vertex]=True
    return count

def solution():
    for k,v in questions:
        print(bfs(v,k))

if __name__ == "__main__":
    n,q=map(int,input().split())
    graph=[[] for _ in range(n+1)]

    for _ in range(n-1):
        v1,v2,cost=map(int,input().split())
        graph[v1].append((v2,cost))
        graph[v2].append((v1,cost))

    questions=[list(map(int,input().split())) for _ in range(q)]
    solution()

댓글남기기