ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 위상정렬_백준 1948 임계경로
    Algorithms과 자료구조/그래프(vertex, edge, node, arc), BFS, DFS, 2021. 11. 24. 21:29

    문제 

    더보기

    문제

    월드 나라는 모든 도로가 일방통행인 도로이고 사이클이 없다.

    무수히 많은 사람들이 월드 나라의 지도를 그리기 위해서, 어떤 시작 도시로부터 도착 도시까지 출발을 하여 가능한 모든 경로를 탐색한다고 한다.

    지도를 그리는 사람들은 지도를 그리는 일을 다 마치고 도착 도시에서 모두 다 만나기로 하였다.

    그렇다고 하였을 때 이들이 만나는 시간은 출발 도시로부터 출발한 후 최소 몇 시간 후에 만날 수 있는가?

    즉, 마지막에 도착하는 사람까지 도착을 하는 시간을 의미한다.

    어떤 사람은 이 시간에 만나기 위하여 1분도 쉬지 않고 달려야 한다. 이런 사람들이 지나는 도로의 수를 카운트하여라.

    출발 도시는 들어오는 도로가 0개이고, 도착 도시는 나가는 도로가 0개이다.

    입력

    첫째 줄에 도시의 개수 n(1 ≤ n ≤ 10,000)이 주어지고 둘째 줄에는 도로의 개수 m(1 ≤ m ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 도로의 정보가 주어진다. 처음에는 도로의 출발 도시의 번호가 주어지고 그다음에는 도착 도시의 번호, 그리고 마지막에는 이 도로를 지나는데 걸리는 시간이 주어진다. 도로를 지나가는 시간은 10,000보다 작거나 같은 자연수이다.

    그리고 m+셋째 줄에는 지도를 그리는 사람들이 출발하는 출발 도시와 도착 도시가 주어진다.

    모든 도시는 출발 도시로부터 도달이 가능하고, 모든 도시로부터 도착 도시에 도달이 가능하다.

    출력

    첫째 줄에는 이들이 만나는 시간을, 둘째 줄에는 1분도 쉬지 않고 달려야 하는 도로의 수가 몇 개인지 출력하여라.

     

    위상 정렬 알고리즘을 통해 최종 지점 (end)까지 의 max값을 구하고 백트래킹으로 해당 노드까지 쉬지 않고 와야 하는 edge들을 count 해주었다.

     

    백 트래블 시 edge들을 방문처리 안 해주어 que에 쌓이는 노드를 중복 체크하여 답이 틀리다고 나왔었으나 한번 q에 쌓인 노드들은 카운트 이후 방문처리를 해주어 중복으로 que에 쌓이지 않도록 해주어 문제를 해결했다.

    백준 1948 임계 경로

    완성 코드

    from collections import deque
    import sys
    input = sys.stdin.readline
    
    N = int(input())
    M = int(input())
    
    graph = [[]for _ in range(N+1)]
    backgraph = [[]for _ in range(N+1)]
    indegree= [0]*(N+1)
    max_v = [0]*(N+1)
    visit = [0]*(N+1)
    
    
    
    for _ in range(M):
        a,b,cost = map(int,input().split())
        graph[a].append((b,cost))
        backgraph[b].append((a, cost))
        indegree[b]+=1
    
    start, end = map(int,input().split())
    
    def topology_sort(start):
        q = deque()
        q.append(start)
        count = 0
        while q: #indegree
            now = q.popleft()
            for i,cost in graph[now]:
                indegree[i]-=1
                max_v[i]= max(max_v[i], max_v[now]+cost)
                 #해당 노드까지 가는데 드는 코스트의 max를 갱신
                if indegree[i]==0:
                    q.append(i)
        
        ##최장거리 출력##
        print(max_v[end])
        
        #back tracking
        q.append(end)
        while q:
            now = q.popleft()
            for i, cost in backgraph[now]:
                if  max_v[now]==max_v[i]+cost:
                    count+=1
                    if visit[i]==0:
                        visit[i]=1
                        q.append(i)
    
            
        ##쉬지않고 달려야 하는 edge 출력 ##
        print(count)
        
    topology_sort(start)

     

     

    댓글

Designed by Tistory.