Module: L'algoritmo di Floyd


Problem

4 /10


La via più breve

Theory Click to read/hide

Se un grafico ha cicli di peso negativo, formalmente l'algoritmo di Floyd-Warshall non è applicabile a tale grafico.

Infatti, per quelle coppie di vertici i e j, tra le quali è impossibile inserire un ciclo di peso negativo, l'algoritmo funzionerà correttamente.

Per le stesse coppie di vertici per le quali non c'è risposta (a causa della presenza di un ciclo negativo sul percorso tra di loro), l'algoritmo di Floyd troverà un numero (possibilmente fortemente negativo, ma non necessariamente) come risposta. Tuttavia, l'algoritmo di Floyd può essere migliorato per gestire tali coppie di vertici in modo ordinato e generare un output, ad esempio, \(- \infty\).

Per fare ciò, ad esempio, si può applicare il seguente criterio "non esistenza del percorso". Quindi, lascia che il solito algoritmo di Floyd funzioni su questo grafico. Allora non esiste cammino minimo tra i vertici i e j se e solo se esiste un vertice t raggiungibile da i e da cui j sia raggiungibile, per cui  \(d [t][t]<0\).

Inoltre, quando si utilizza l'algoritmo di Floyd per grafici con cicli negativi, va ricordato che le distanze che sorgono nel processo di lavoro possono andare negativamente, esponenzialmente con ogni fase. Pertanto, dovresti fare attenzione contro l'overflow di numeri interi limitando tutte le distanze dal basso a un certo valore (ad esempio,  \(- \infty\)).

Verbalmente, la soluzione può essere descritta come segue:
Dopo che l'algoritmo Floyd-Warshall ha funzionato per il grafico di input, iteriamo su tutte le coppie di vertici \((i,j)\), e per ognuna di queste coppie controlliamo, infinitamente il percorso più breve da i a j è piccolo o no. Per fare questo, iteriamo sul terzo vertice t, e se risulta essere \(d[t][t] < 0\)  (cioè si trova nel ciclo di peso negativo), ed è raggiungibile da i e j — allora il percorso \((i,j)\) può essere di lunghezza infinitesimale.

Problem

Ti viene fornito un grafico completo orientato con alcuni pesi (lunghezze) assegnati ai suoi bordi. I pesi possono essere positivi, negativi o zero. Siamo interessati alla lunghezza minima di tutti i possibili percorsi tra tutte le coppie di vertici distinti in questo grafico. Sarà necessario scoprire se questo minimo esiste e, in caso affermativo, calcolarlo. (Non c'è minimo se è possibile trovare nel grafo un cammino di lunghezza negativa, arbitrariamente grande in valore assoluto, tendente all'infinito).
 
Input
La prima linea è di N≤50 vertici. Poi viene la matrice di adiacenza del grafico, cioè N righe, ognuna delle quali contiene N numeri. Il numero j-esimo nella riga i-esima della matrice di adiacenza specifica la lunghezza del bordo che va dall'i-esimo vertice al j-esimo. Le lunghezze possono assumere qualsiasi valore da -1000000 a 1000000. È garantito che ci siano zeri sulla diagonale principale della matrice.
 
Uscita
Stampa un singolo numero – minimo richiesto. Se non esiste, l'output  -1.
Esempi
# Input Uscita
1
3
0 42 18468 
6335 0 26501 
19170 15725 0 
42
2
3
0 -7 3
-2 0 10
2 215 0 
-1