I filosofi hanno riflettuto a lungo sul problema del carrello . Sfortunatamente, nessun essere umano ha ancora risolto questo problema. Fortunatamente, come programmatori possiamo usare i computer per risolvere il problema per noi!
Ingresso
Il programma prenderà come input un grafico diretto (finito) (con al massimo un bordo da x
a y
, per qualsiasi x
e y
), con un nodo designato e un numero intero non negativo collegato a ciascun bordo (che rappresenta il numero di persone legate a quella traccia) . Inoltre, ogni nodo ha almeno un bordo di uscita.
Il carrello inizia nel nodo designato. Ad ogni giro, se il carrello si trova sul nodo x
, l'utilitario seleziona un bordo (x,y)
. Le persone su quel bordo muoiono e il carrello ora è al limite y
. Questo processo continua per sempre.
Nota che le persone possono morire solo una volta, quindi se il bordo (x,y)
ha delle n
persone legate ad esso, e il carrello vi scorre sopra, diciamo 100 volte, causerà comunque solo n
morti.
Produzione
L'utilitario fa le sue scelte in modo tale da ridurre al minimo il numero di persone che muoiono (che è garantito per essere finito, poiché ci sono solo persone finite). Il tuo programma genererà questo numero.
Formato di input
Puoi prendere il grafico di input in qualsiasi modo ragionevole tu voglia. Ad esempio, potresti prenderlo come una matrice e contare il nodo designato come quello etichettato 0. Oppure potresti usare qualcosa di simile x1,y1,n1;x2,y2,n2;...
. Ad esempio 0,a,0;a,b,5;a,c,1;b,b,0;c,c,0
per rappresentare il problema del carrello standard (con anelli all'estremità).
Casi test
0,a,0;a,b,5;a,c,1;b,b,0;c,c,0
-> 1 (vai da 0 a a, da a a c (uccidendo una persona), quindi continua ad avvolgere il carrello da c a c).0,0,1;0,a,5;a,a,0
-> 1 (continua da 0 a 0, investendo 1 persona per l'eternità),0,a,5;0,b,1;a,a,1;b,b,6
-> 6 (0 -> a -> a -> a -> a -> ... (nota che la soluzione golosa di andare a b sarebbe errata))0,a,1;0,b,5;a,b,1;b,a,1
-> 3 (0 -> a -> b -> a -> b -> ...)0,a,1;0,b,1;a,a,0;b,b,0
-> 1 (Nota che ci sono due diverse opzioni che l'utilitarista potrebbe prendere che uccidono solo una persona)
Questo è code-golf , quindi vince la risposta più breve! In bocca al lupo.
Note: Non ci saranno loop de loops malati e la deriva multitraccia è vietata. Inoltre, anche se preferisco pensare a questo problema in termini di tre leggi (e) di Asimov, Peter Taylor ha notato nella sandbox che questo problema è matematicamente equivalente a quello di trovare il rho (percorso dei loop su se stesso) di minor peso .