Una rete di flusso è un grafico diretto G = (V, E)
con un vertice di origine s ϵ V
e un vertice di sink t ϵ V
e in cui ogni bordo (u, v) ϵ E
del grafico (che collega i nodi u ϵ V
e v ϵ V
) ha 2 quantità associate ad esso:
c(u, v) >= 0
, la capacità del bordoa(u, v) >= 0
, il costo dell'invio di un'unità attraverso il bordo
Definiamo una funzione 0 <= f(u, v) <= c(u, v)
come il numero di unità che passano attraverso un determinato fronte (u, v)
. Pertanto, il costo per un determinato vantaggio (u, v)
è a(u, v) * f(u, v)
. Il problema del flusso di costo minimo è definito come la riduzione al minimo del costo totale su tutti i bordi per un determinato importo di flusso d
, dato dalla seguente quantità:
I seguenti vincoli si applicano al problema:
- Requisiti di capacità : il flusso attraverso un determinato bordo non può superare la capacità di quel bordo (
f(u, v) <= c(u, v)
). - Simmetria obliqua : il flusso attraverso un determinato bordo deve essere antisimmetrico quando la direzione è invertita (
f(u, v) = -f(v, u)
). - Conservazione del flusso : il flusso netto in qualsiasi nodo non-source non-sink deve essere 0 (per ciascuno
u ∉ {s, t}
, sommando tuttow
,sum f(u, w) = 0
). - Flusso richiesto : il flusso netto fuori dalla sorgente e il flusso netto nel lavandino devono entrambi uguagliare il flusso richiesto attraverso la rete (sommando tutto
u
,sum f(s, u) = sum f(u, t) = d
).
Data una rete di flusso G
e un flusso richiesto d
, genera il costo minimo per l'invio di d
unità attraverso la rete. Si può presumere che esista una soluzione. d
e tutte le capacità e i costi saranno numeri interi non negativi. Per una rete con N
vertici etichettati con [0, N-1]
, il vertice di origine sarà 0
e il vertice di sink sarà N-1
.
Questo è code-golf , quindi vince la risposta più breve (in byte). Ricorda che si tratta di una competizione all'interno delle lingue e tra le lingue, quindi non aver paura di pubblicare una soluzione in una lingua dettagliata.
Gli incorporati sono consentiti, ma si consiglia di includere soluzioni senza incorporati, sia come soluzione aggiuntiva nella stessa risposta, sia come risposta indipendente.
L'input può essere in qualsiasi modo ragionevole che includa le capacità e i costi di ciascun vantaggio e la domanda.
Casi test
I casi di test sono forniti nel seguente formato:
c=<2D matrix of capacities> a=<2D matrix of costs> d=<demand> -> <solution>
c=[[0, 3, 2, 3, 2], [3, 0, 5, 3, 3], [2, 5, 0, 4, 5], [3, 3, 4, 0, 4], [2, 3, 5, 4, 0]] a=[[0, 1, 1, 2, 1], [1, 0, 1, 2, 3], [1, 1, 0, 2, 2], [2, 2, 2, 0, 3], [1, 3, 2, 3, 0]] d=7 -> 20
c=[[0, 1, 1, 5, 4], [1, 0, 2, 4, 2], [1, 2, 0, 1, 1], [5, 4, 1, 0, 3], [4, 2, 1, 3, 0]] a=[[0, 1, 1, 2, 2], [1, 0, 2, 4, 1], [1, 2, 0, 1, 1], [2, 4, 1, 0, 3], [2, 1, 1, 3, 0]] d=7 -> 17
c=[[0, 1, 4, 5, 4, 2, 3], [1, 0, 5, 4, 3, 3, 5], [4, 5, 0, 1, 5, 5, 5], [5, 4, 1, 0, 3, 2, 5], [4, 3, 5, 3, 0, 4, 4], [2, 3, 5, 2, 4, 0, 2], [3, 5, 5, 5, 4, 2, 0]] a=[[0, 1, 4, 2, 4, 1, 1], [1, 0, 3, 2, 2, 1, 1], [4, 3, 0, 1, 4, 5, 2], [2, 2, 1, 0, 2, 2, 3], [4, 2, 4, 2, 0, 4, 1], [1, 1, 5, 2, 4, 0, 2], [1, 1, 2, 3, 1, 2, 0]] d=10 -> 31
c=[[0, 16, 14, 10, 14, 11, 10, 4, 3, 16], [16, 0, 18, 19, 1, 6, 10, 19, 5, 4], [14, 18, 0, 2, 15, 9, 3, 14, 20, 13], [10, 19, 2, 0, 2, 10, 12, 17, 19, 22], [14, 1, 15, 2, 0, 11, 23, 25, 10, 19], [11, 6, 9, 10, 11, 0, 14, 16, 25, 4], [10, 10, 3, 12, 23, 14, 0, 11, 7, 8], [4, 19, 14, 17, 25, 16, 11, 0, 14, 5], [3, 5, 20, 19, 10, 25, 7, 14, 0, 22], [16, 4, 13, 22, 19, 4, 8, 5, 22, 0]] a=[[0, 12, 4, 2, 9, 1, 1, 3, 1, 6], [12, 0, 12, 16, 1, 2, 9, 13, 2, 3], [4, 12, 0, 2, 2, 2, 2, 10, 1, 1], [2, 16, 2, 0, 2, 1, 8, 4, 4, 2], [9, 1, 2, 2, 0, 5, 6, 23, 5, 8], [1, 2, 2, 1, 5, 0, 13, 12, 12, 1], [1, 9, 2, 8, 6, 13, 0, 9, 4, 4], [3, 13, 10, 4, 23, 12, 9, 0, 13, 1], [1, 2, 1, 4, 5, 12, 4, 13, 0, 13], [6, 3, 1, 2, 8, 1, 4, 1, 13, 0]] d=50 -> 213
Questi casi di test sono stati calcolati con la libreria NetworkX Python .