原理:如果存在一个顶点k,以k作为中介点的时候,顶点i和顶点j的最短路径缩短,那么就用顶点k作为顶点i和j的中介点。
//初始化后,cost[i][j]代表从i到j所用花费
//step[i][j]代表从i到j中间要走的步骤
int[][] cost = new int[potatoNum.length+1][potatoNum.length+1];
int[][] step = new int[potatoNum.length+1][potatoNum.length+1];
//把step初始化,其值等于列标
for (int i = 0; i < (step.length + 1); i++) {
for (int i1 = 0; i1 < (step.length + 1); i1++) {
step[i][i1] = i1;
}
}
//得到路径矩阵和开销矩阵
for (int i=0;i<=potatoNum.length;i++){
for (int i1 = 0; i1 <=potatoNum.length; i1++) {
for (int i2 = 0; i2 <= potatoNum.length; i2++) {
if (cost[i][i2]==0)continue;
if (cost[i2][i1]==0)continue;
//如果以i2为节点,从i到i1的路径更近
if (cost[i][i1]<(cost[i][i2]+cost[i2][i1])){
// 记录最短花费
cost[i][i1]=(cost[i][i2]+cost[i2][i1]);
//记录路径
//如果从i到i1的距离能通过以i2为中介点来缩短的话,那么从i到i2肯定有一条路,这条路更短一些,并且这条路可能还有更短的路径。
step[i][i1]=step[i][i2];
}
}
}
}