Ogni percorso definisce una sequenza direzionata di città. Poiché Bessie vuole utilizzare un solo percorso, per ciascun percorso è sufficiente verificare:
la città compare prima della città ?
Se questa condizione è soddisfatta, Bessie può usare questo percorso e pagare il suo costo fisso. Tra tutti i percorsi adatti, bisogna trovare il percorso con il costo minimo.
Esempio
Nell'esempio ci sono percorsi:
3 \to 2 \to 1;
2 \to 1 \to 4 \to 3;
4 \to 1 \to 7 \to 8 \to 2;
Poiché A = 1 e B = 2, Bessie può usare solo il terzo percorso: la città compare in esso prima della città . Il costo di questo percorso è pari a .
Implementazione dell'algoritmo
Dichiariamo una costante .
#define INF 1000000000Leggiamo i dati in ingresso.
scanf("%d %d %d", &a, &b, &n);Inizializziamo la variabile , in cui conserveremo la risposta.
res = INF;Scorriamo gli percorsi.
for (i = 0; i < n; i++)
{Leggiamo il costo del percorso e il numero di città su questo percorso.
scanf("%d %d", &cost, &sz);La variabile contiene , se la città non è ancora comparsa sul percorso corrente.
flag = false;Leggiamo in sequenza le città sul percorso corrente.
for (j = 0; j < sz; j++)
{
scanf("%d", &city);Se compare la città , impostiamo flag = true.
if (city == a) flag = true;Se compare la città , e prima di essa sul percorso è già comparsa la città А~(flag = true), allora Bessie può usare questo percorso, pagando il suo costo .
Se ci sono più percorsi adatti, scegliamo il percorso con il costo minimo.
if (flag && city == b) res = min(res, cost);
}
}Dopo aver elaborato tutti i percorsi, stampiamo la risposta.
if (res == INF)
printf("-1\n");
else
printf("%d\n", res);