屏幕快照 2018-04-26 下午4.11.23.png
、、、
pragma mark - - Floyd Warshall 算法
/*
Floyd Warshall 算法:算法关键在于
if (e[i][j]>e[i][k]+e[k][j]) {
e[i][j] = e[i][k]+e[k][j];
}
求两个点之间的路程最短,比如a,b,我们可以引入顶点k,判断e[a][b]是否大于e[a][k]+e[k][b];
如果大于,那么 a b之间的最短距离可以更新为e[a][b]=e[a][k]+e[k][b]; 再依次引入其他顶点
*/
/*
e[10][10] 是一个邻接矩阵。e[i][j] 代表i到j的距离
如果i和j相等,e[i][j]=0;
*/
-(void)test1 {
int e[10][10];
for (int i=0; i<10; i++) {
for (int j=0; j<10; j++) {
if (i==j) {
e[i][j]=0;
}else{
e[i][j]=999;
}
}
}
e[1][2]=2;
e[1][3]=6;
e[1][4]=4;
e[2][3]=3;
e[3][1]=7;
e[3][4]=1;
e[4][1]=5;
e[4][3]=12;
for (int k=1; k<=4; k++) {
for (int i=1; i<=4; i++) {
for (int j=1; j<=4; j++) {
if (e[i][j]>e[i][k]+e[k][j]) {
e[i][j] = e[i][k]+e[k][j];
}
}
}
}
// 打印最短距离地图
printf("地图:\n");
for (int i=1; i<=4; i++) {
for (int j=1; j<=4; j++) {
printf("%5d",e[i][j]);
}
printf("\n");
}
printf("\n");
// 顶点1到顶点4的距离
printf("顶点1到顶点4的距离:%d",e[1][4]);
}
、、、