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].