Était en discussion https://togetter.com/li/776049
L'utilisez-vous correctement selon le format d'entrée?
https://www.hamayanhamayan.com/entry/2018/09/17/163004
Chaque fois que vous connectez un nœud, les choix se développent et vous voulez toujours sélectionner le plus petit. → Utilisez une file d'attente prioritaire (heapq).
Lorsqu'un taple est passé à heapq, la valeur minimale est déterminée par le premier élément.
O(ElogV)。 Est-ce plus rapide avec le tas de Fibonacci?
https://algo-logic.info/prim-mst/
Méthode Prim
import heapq
def main():
    n = int(input())
    next = []   #Liste de gestion des contiguïtés
    for _ in range(n):
        l = list(map(int, input().split()))
        next.append([(c, i) for i, c in enumerate(l) if c != -1])
    visited = [0] * n
    connection = 0
    q = [(0, 0)]    # (cost, v)
    heapq.heapify(q)
    ans = 0
    while len(q):
        cost, v = heapq.heappop(q)
        if visited[v]:
            continue
        #Connectez-vous avec ce nœud
        visited[v] = 1
        connection += 1
        ans += cost
        
        #Mettre en file d'attente où vous pouvez aller à partir du nœud nouvellement connecté
        for i in next[v]:
            heapq.heappush(q, i)
        
        #Quitter lorsque tous les nœuds sont connectés
        if connection == n:
            break
    print(ans)
    return
1 → Trier en fonction du coût du côté. Utilisez la technique du tri par le premier élément lorsque chaque élément de la liste est tabulé et trié. 2 → "Closing the road" = "Créer un côté où les deux points sont déjà connectés", vérifiez donc avec l'arbre Union Find.
O(ElogV)。
https://algo-logic.info/kruskal-mst/
Méthode Clascal
def main():
    V, E = map(int, input().split())
    uf = UnionFind(V)
    #Processus de 1
    edges = []
    for _ in range(E):
        s, t, w = map(int, input().split())
        edges.append((w, s, t))
    edges.sort()
    #Processus 2
    cost = 0
    for edge in edges:
        w, s, t = edge
        if not uf.same(s, t):
            cost += w
            uf.union(s, t)
    print(cost)
    return
Post-scriptum (6/1)
ARC076 D - Built? Premièrement: pensez à réduire E à l'avance s'il est énorme. → Cette fois, nous avons utilisé que les villes qui ne sont pas adjacentes les unes aux autres sur les coordonnées x et y ne sont pas sélectionnées. Deuxièmement: si les deux axes x et y correspondent à des villes adjacentes, ils seront comptés deux fois, mais je m'en fiche.
def main():
    N = int(input())
    nodes = []
    for i in range(N):
        x, y = map(int, input().split())
        nodes.append((x, y, i))  #Si les coordonnées sont uniques, vous pouvez les mettre dans Union Find sous forme de taples, mais comme il y a des cas où il y a des villes aux mêmes coordonnées, numérotez-les.
    uf = UnionFind(N)
    nodes_sorted_by_x = sorted(nodes)
    nodes_sorted_by_y = sorted(nodes, key=lambda i: i[1])
    edges = []
    for i in range(N - 1):
        dx = abs(nodes_sorted_by_x[i][0] - nodes_sorted_by_x[i + 1][0])
        dy = abs(nodes_sorted_by_x[i][1] - nodes_sorted_by_x[i + 1][1])
        cost = min(dx, dy)
        edges.append((cost, nodes_sorted_by_x[i][2],  nodes_sorted_by_x[i + 1][2]))
    for i in range(N - 1):
        dx = abs(nodes_sorted_by_y[i][0] - nodes_sorted_by_y[i + 1][0])
        dy = abs(nodes_sorted_by_y[i][1] - nodes_sorted_by_y[i + 1][1])
        cost = min(dx, dy)
        edges.append((cost, nodes_sorted_by_y[i][2],  nodes_sorted_by_y[i + 1][2]))
    edges.sort()
        
    ans = 0
    for edge in edges:
        w, s, t = edge
        if not uf.same(s, t):
            ans += w
            uf.union(s, t)
    print(ans)
Appendix
Spécifie la clé pour trier la liste des taples.
#Généralement trié par le premier élément du taple.
sortedByFirstKey  = sorted(listOfTuple)
#Spécifiez une expression lambda pour Key afin qu'elle trie par le deuxième élément du taple.
sortedBySecondKey = sorted(listOfTuple, key=lambda i: i[1])
# reverse
sortedBySecondKey = sorted(listOfTuple, key=lambda i: i[1], reverse=True)
Surtout lorsque vous essayez de trier la liste des dictionnaires, une erreur se produit, il est donc nécessaire de spécifier clé comme décrit ci-dessus.
Spécifiez l'ordre inverse avec reverse. Peut être utilisé avec sort () ou sorted ().
Recommended Posts