J'ai profité de 10 minutes de break pour regarder le challenge avec Skynet et les graphes.
En réalité, après avoir bien relu l'énoncé, il n'est pas nécessaire de faire un Dijkstra ou de chercher à faire quelque chose de complexe, car il y a une contrainte importante dans l'énoncé : chaque noeud ne peut être relié qu'à une seule porte ! Cela signifie, vu que Skynet ne bouge que d'un noeud à la fois, qu'il suffit de s'assurer que Skynet ne puisse pas rejoindre "la porte la plus proche" s'il y en a une...
En mode extrêmement bourrin, ça donne ça (note que dans edges, je mets des couples (i,j) et (j,i) pour tout arc (i,j) reçu en entrée, pour pas me prendre la tête) :
while True:
skynet = int(raw_input())
i,j = None, None
for gate in gateways:
if (skynet, gate) in edges:
i,j = skynet, gate
break
if i == None and j == None:
i,j = edges[0]
print '%d %d' % (i,j)
edges.remove((i,j))
edges.remove((j,i))