#!/usr/bin/python3 # Ukázkový vstup: # 5 # A 300 B 305 C 310 # A 320 B 325 C 330 # A 340 B 345 C 350 # C 300 B 305 A 310 # C 320 B 325 A 330 # C 340 B 345 A 350 # A 300 D 307 B 315 E 320 # A 330 D 337 B 345 E 350 # E 300 B 305 D 313 A 320 # E 330 B 335 D 343 A 350 import sys, collections # Následníci vrcholu jako dvojice (vrchol, délka hrany) N = collections.defaultdict(lambda: []) # Časy, pro které chceme na zastávce vytvořit vrcholy z_casy = collections.defaultdict(lambda: set()) ## 1. NAČTENÍ VSTUPU A VYTVOŘENÍ GRAFU L = int(input()) # čas na přestup for spoj, radek in enumerate(sys.stdin): slova = radek.split() # Magie: převod trasy na seznam dvojic (zastávka, čas) trasa = list(zip(slova[::2], map(int, slova[1::2]))) for (z,t) in trasa: N[z, t, None].append(( (z, t, spoj), 0 )) # nástupní hrana N[z, t, spoj].append(( (z, t+L, None), 0 )) # výstupní hrana z_casy[z].add(t) z_casy[z].add(t + L) # Projdi všechny dvojice sousedních zastávek na trase for (z1, t1), (z2,t2) in zip(trasa, trasa[1:]): N[z1, t1, spoj].append(( (z2, t2, spoj), t2-t1 )) # jízdní hrana ## 2. SETŘÍDĚNÍ ČASŮ NA ZASTÁVKÁCH A VYTVOŘENÍ ČEKACÍCH HRAN for z, casy in z_casy.items(): casy = sorted(casy) for t1, t2 in zip(casy, casy[1:]): N[z, t1, None].append(( (z,t2,None), 0 )) # Vytvoříme virtuální vrchol "start", ze kterého budeme hledat # nejdelší cestu. Jeho následníky budou nejdřívější časy na všech # zastávkách. N['start'].append(( (z, casy[0], None), 0 )) ## 3. NALEZENÍ NEJDELŠÍ CESTY D = {} # Délka nejdelší cesty vycházející z daného vrcholu (je-li už spočítána) kudy_dal = {} def nejdelsi(u): # spočítej D[u] if u in D: return D[u] else: max_cesta = 0 kam = None for (v,delka_hrany) in N[u]: delka_cesty = delka_hrany + nejdelsi(v) if delka_cesty > max_cesta: max_cesta = delka_cesty kam = v D[u] = max_cesta kudy_dal[u] = kam return D[u] delka = nejdelsi('start') print(delka) # vypiš trasu v = 'start' while v: print(v) v = kudy_dal[v]