El Segon Camí X77211


Statement
 

pdf   zip   main.py

Sabem calcular el camí de cost mínim entre dos vèrtexos qualsevol (si existeix), en un graf dirigit etiquetat amb nombres positius, gràcies a l’algorisme de Dijkstra, que tots hauríem de conèixer.

En aquest problema volem calcular el cost del segon camí de cost mínim, de manera que aquest camí no comparteixi cap aresta amb el camí de cost mínim original, que s’ha calculat sense cap restricció.

Així doncs, el problema és, donats:

  • un graf GG dirigit i etiquetat (amb nombres enters positius),

  • dos vertexos ss i ee,

Feu una funció segon_millor_cami(G,s,e) que calculi el cost del camí de cost mínim a GG entre ss i ee, i que no passa per cap aresta del conjunt d’arestes EminE_{min} (on EminE_{min} és el conjunt d’arestes del camí de cost mínim a GG entre ss i ee, calculat sense cap restricció).

Precondició

GG és un graf dirigit i etiquetat amb nombres enters positius. Si NN és el nombre de vertexos de GG, 0s<N0 \leq s < N i 0e<N0 \leq e < N

Entrada

L’entrada al programa serà el graf GG i els vertexos ss i ee.

Primer tenim un nombre nn, que és el nombre de vèrtexos del graf (anomenats, per tant, amb els nombres 0n10\dots n-1), seguit d’un nombre mm, que és el nombre d’arestes del graf. Tot seguit tenim mm grups de tres nombres uu, vv, ww, significant l’aresta entre uu i vv amb etiqueta ww. És clar que 0u,v<n0 \leq u,v < n, i que w>0w > 0. Finalment tenim dos nombres ss i ee, que són els vèrtexos inicial i destinació respectivament, i 0s,e<n0 \leq s,e < n.

Vegeu els exemples que formen el joc de proves públic.

Observacions

Heu de baixar-vos el fitxer code.py (icona de la serp). Aquest fitxer és un programa amb tot el que cal per executar els jocs de prova públics. Només falta, clar, la funció que us demana l’enunciat. Aquest fitxer l’heu de completar amb el codi que falta, i això, tot, és el que heu d’enviar al Jutge com a solució.

Dins el fitxer code.py teniu una versió modificada de l’algorisme de Dijkstra. La modificació està pensada per fer senzilla la solució a aquest problema. Està convenientment comentat, però entendre i saber utilitzar aquesta versió modificada de Dijkstra forma part de la solució d’aquest problema.

També podeu trobar la funció per llegir grafs que ja heu fet servir diversos cops a les sessions de laboratori. No cal, per tant, que vosaltres us amoïneu per llegir l’entrada. Us ho donem fet.

L’eficiència i la qualitat de la solució es tindran en compte a la correcció manual.

Public test cases
  • Input

    5 7
    0 1 2
    0 2 5
    1 2 1
    1 3 4
    2 3 2
    2 4 3
    3 4 2
    0 4
    

    Output

    9
    
  • Input

    7 10
    0 1 7
    0 2 7
    0 3 2
    1 4 3
    2 1 5
    2 5 8
    3 2 4
    3 5 6
    5 4 4
    5 6 3
    0 6
    
    

    Output

    -1
    
  • Input

    6 10
    1 0 6
    1 5 15
    3 4 3
    3 1 8
    4 0 20
    0 5 5
    0 2 1
    5 1 10
    4 1 2
    2 3 4
    3 5
    
    

    Output

    23
    
  • Input

    2 1
    0 1 1000
    1 0
    
    

    Output

    -1
    
  • Input

    3 3
    0 2 100
    0 1 40
    1 2 60
    0 2
    
    

    Output

    100
    
  • Information
    Author
    Jordi Delgado
    Language
    Catalan
    Other languages
    Spanish
    Official solutions
    Python
    User solutions
    Python