Cod sursa(job #3375075)

Utilizator mihaisoare349Soare Mihai-Alexandru mihaisoare349 Data 10 noiembrie 2026 10:59:18
Problema Sate Scor 0
Compilator py Status done
Runda Arhiva de probleme Marime 1.35 kb
from collections import deque
from dataclasses import dataclass, field
from itertools import batched, islice


@dataclass(eq=False)
class Node:
    label: int
    roads: list[tuple["Node", int]] = field(default_factory=list)
    position: int | None = None


def read_numbers(path):
    with open(path) as file:
        yield from map(int, file.read().split())


def build_graph(n, roads):
    nodes = {label: Node(label) for label in range(1, n + 1)}
    for left, right, kilometres in roads:
        nodes[left].roads.append((nodes[right], kilometres))
        nodes[right].roads.append((nodes[left], -kilometres))
    return nodes


def breadth_first(start):
    start.position = 0
    queue = deque([start])
    while queue:
        node = queue.popleft()
        yield node
        for other, offset in node.roads:
            if other.position is None:
                other.position = node.position + offset
                queue.append(other)


def distance_between(start, target):
    for node in breadth_first(start):
        if node is target:
            return abs(node.position)


def main():
    numbers = read_numbers("sate.in")
    n, m, x, y = islice(numbers, 4)
    nodes = build_graph(n, batched(islice(numbers, 3 * m), 3))
    with open("sate.out", "w") as out:
        print(distance_between(nodes[x], nodes[y]), file=out)


if __name__ == "__main__":
    main()