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()