http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DPL_2_A
import heapq
INF = 10**10
class Edge:
    to = -1
    w = -1
    def __init__(self, to, w):
        self.to = to
        self.w = w
def Dijkstra(Graph, s):
    dist = [INF] * len(Graph)
    dist[s] = 0
    prev = [-1] * len(Graph)
    #Mettre en file d'attente le sommet de départ
    #[Distance la plus courte au pic correspondant (heure actuelle),Index du sommet correspondant]
    que = [[0,s]]
    #Convertir en file d'attente prioritaire
    heapq.heapify(que)
    while len(que) > 0:
        #Récupérer le premier élément d'une file d'attente prioritaire
        #v est le numéro du sommet,d est la distance la plus courte actuelle par rapport au sommet correspondant
        p = heapq.heappop(que)
        v = p[1]
        d = p[0]
        #Dans la conception de logiciels, il y a le traitement suivant, mais est-ce inutile?
        #Je ne comprends pas vraiment le besoin
        #if d > dist[v]:
        #   continue
        #Calculer la distance pour chaque sommet qui peut être atteint à partir du sommet correspondant v
        for e in Graph[v]:
            #Si la distance la plus courte ne peut pas être mise à jour, ne faites rien
            if dist[v] + e.w >= dist[e.to] :
                continue
            #Voici quand la distance la plus courte peut être mise à jour
            #Transférer les informations de sommet de destination vers une file d'attente prioritaire
            heapq.heappush(que,[dist[v] + e.w, e.to])
            #Mettre à jour la distance de destination la plus courte
            dist[e.to] = dist[v] + e.w
            #Souvenez-vous du nœud avant la destination
            #Non utilisé pour les problèmes AOJ
            prev[e.to] = v
    for d in dist:
        if d == INF:
            print("INF")
        else:
            print(d)
    return
def main():
    n, m, s = map(int, input().split())
    Graph =  [[] for j in range(n)]
    for i in range(m):
        a, b, w = map(int, input().split())
        Graph[a].append(Edge(b, w))
        #Le problème AOJ est un graphe valide (http)://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DPL_2_A)
        #Graph[b].append(Edge(a, w))
    Dijkstra(Graph, s)
main()
        Recommended Posts