Floyd + Lexicographic Order
[Cpp]
# Include "stdio. h"
# Include "string. h"
# Define INF 99999999
Int map [505] [505], tax [505], path [505] [504];
Int n;
Void init ()
{
Int I, j;
For (I = 1; I <= n; I ++)
For (j = 1; j <= n; j ++)
If (I = j) map [I] [j] = 0;
Else map [I] [j] = INF;
}
Void input ()
{
Int I, j, k;
For (I = 1; I <= n; I ++)
For (j = 1; j <= n; j ++)
{
Scanf ("% d", & k );
If (k! =-1) map [I] [j] = k;
Path [I] [j] = j;
}
For (I = 1; I <= n; I ++)
Scanf ("% d", & tax [I]);
}
Void floyd ()
{
Int I, j, k, t;
For (k = 1; k <= n; k ++)
{
For (I = 1; I <= n; I ++)
{
For (j = 1; j <= n; j ++)
{
T = map [I] [k] + map [k] [j] + tax [k];
If (map [I] [j]> t)
{
Map [I] [j] = t;
Path [I] [j] = path [I] [k];
}
Else if (t = map [I] [j])
{
If (path [I] [j]> path [I] [k])
Path [I] [j] = path [I] [k];
}
}
}
}
}
Void output ()
{
Int I, j, k;
While (scanf ("% d", & I, & j ))
{
If (I =-1 & j =-1) break;
Printf ("From % d to % d: \ n", I, j );
Printf ("Path: % d", I );
K = I;
While (k! = J)
{
Printf ("--> % d", path [k] [j]);
K = path [k] [j];
}
Printf ("\ n ");
Printf ("Total cost: % d \ n", map [I] [j]);
}
}
Int main ()
{
While (scanf ("% d", & n), n)
{
Init ();
Input ();
Floyd ();
Output ();
}
Return 0;
}
Author: yyf572132811