p[i][j]记录从i到j的路径上的下一个结点(后继),修改最短路时更新即可。
void floyd()
{
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(map[i][j]>map[i][k]+map[k][j]+b[k]){
map[i][j]=map[i][k]+map[k][j]+b[k];
h[i][j]=h[i][k];
}
else if(map[i][j]==map[i][k]+map[k][j]+b[k]){//路径长度相同要求字典序最小
if(h[i][j]>h[i][k])
h[i][j]=h[i][k];
}
}
拓展:若要求记录前驱结点则修改为h[i][j]=h[k][j].