Uva_590
Based on the arrival time, we can regard the graph as a K-layer, and then use spfa to find the shortest path of each point.
# Include <stdio. h>
# Include < String . H>
# Define INF 1000000000
Int N, K, G [ 15 ] [ 15 ] [ 40 ], T [ 15 ] [ 15 ], F [15 ] [ 1010 ];
Int Q [ 11000 ], D [ 11000 ], INQ [ 15 ] [ 1010 ];
Int Init ()
{
Int I, J, K;
Scanf ( " % D " , & N, & K );
If (! N &&! K)
Return 0 ;
For (I = 0 ; I <n; I ++)
For (J = 0 ; J <n; j ++)
{
If (I = J)
Continue ;
Scanf ( " % D " , & T [I] [J]);
For (K = 0 ; K <t [I] [J]; k ++)
Scanf ( " % D " , & G [I] [J] [k]);
}
Return 1 ;
}
Void Solve ()
{
Int I, J, K, x, t, rear, front, M =10100 , Min;
For (I = 0 ; I <n; I ++)
For (J = 1 ; J <= K; j ++)
F [I] [J] = inf;
Min = inf;
Front = rear = 0 ;
Memset (INQ, 0 , Sizeof (INQ ));
D [rear] = Q [rear] = 0 ;
Rear ++;
While (Front! = Rear)
{
X = Q [Front];
T = d [Front];
INQ [x] [T] = 0 ;
If (T = K)
{
If (X = N- 1 & F [x] [T] <min)
Min = f [x] [T];
}
Else
{
For (I = 0 ; I <n; I ++)
If (I! = X & T [x] [I])
{
K = T % T [x] [I];
If (G [x] [I] [k] & F [x] [T] + G [x] [I] [k] <F [I] [t + 1 ])
{
F [I] [t + 1 ] = F [x] [T] + G [x] [I] [k];
If (! INQ [I] [t + 1 ])
{
Q [rear] = I;
D [rear] = T + 1 ;
Rear ++;
If (Rear> m)
Rear = 0 ;
INQ [I] [t + 1 ] = 1 ;
}
}
}
}
Front ++;
If (Front> m)
Front = 0 ;
}
If (Min = inf)
Printf ( " No flight possible. \ n " );
Else
Printf ( " The best flight costs % d. \ n " , Min );
}
Int Main ()
{
Int T = 0 ;
While (Init ())
{
Printf ( " Scenario # % d \ n " , ++ T );
Solve ();
Printf ( " \ N " );
}
Return 0 ;
}