算法 Floyd Warshall 算法

屏幕快照 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]);

}
、、、

你可能感兴趣的:(算法 Floyd Warshall 算法)