最短路径 - 弗洛伊德算法 Floyd - C语言超简单实现

多源最短路径。任意两点的最短路径。
用一个二维矩阵存储网的信息。
最短路径 - 弗洛伊德算法 Floyd - C语言超简单实现_第1张图片
[ 0 2 6 4 ∞ 0 3 ∞ 7 ∞ 0 1 5 ∞ 12 0 ] \left[ \begin{matrix} 0 & 2 & 6 & 4 \\ ∞ & 0 & 3 & ∞ \\ 7 & ∞ & 0 & 1\\ 5 & ∞ &12 & 0 \end{matrix} \right] 0752063012410
若有 n n n个顶点,对任意从顶点 i i i到顶点 j j j,权值为 e [ i ] [ j ] e[i][j] e[i][j]

弗洛伊德算法可以看作在不停更新二维矩阵,核心代码如下:

/* 动态规划思想 */
for(k=1;k<=n;k++)
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			if(e[i][j]>e[i][k]+e[k][j])
				e[i][j]=e[i][k]+e[k][j];

算法改进:

/* 动态规划思想 */
/* 第6行:禁止正无穷的权值的与其他权值相加*/
for(k=1;k<=n;k++)
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			if(e[i][j]>e[i][k]+e[k][j] && e[i][k]<inf && e[k][j]<inf)
				e[i][j]=e[i][k]+e[k][j];

更新完后如下:
[ 0 2 5 4 9 0 3 4 6 8 0 1 5 7 10 0 ] \left[ \begin{matrix} 0 & 2 & 5 & 4 \\ 9 & 0 & 3 & 4 \\ 6 & 8 & 0 & 1\\ 5 & 7 &10 & 0 \end{matrix} \right] 09652087530104410
完整代码如下:

#include <Stdio.h>

#define inf 9999999

void InitNet(int, int [][10]);
void NetWeight(int, int [][10]);
void Floyd(int, int [][10]);


int main() {
    int n, m, i, j, e[10][10];
    printf("请输入顶点个数和边的条数:\n");
    scanf("%d %d", &n, &m);
    InitNet(n, e);
    NetWeight(m, e);
    Floyd(n, e);

    //输出最终结果
    for (i = 1; i <= n; i++) {
        for (j = 1; j <= n; j++) printf("%10d", e[i][j]);
        printf("\n");
    }
    return 0;
}


/* 初始化网 */
void InitNet(int n, int e[10][10]) {
    int i, j;
    for (i = 1; i <= n; i++)
        for (j = 1; j <= n; j++)
            if (i == j) e[i][j] = 0;
            else e[i][j] = inf;
}


/*读入边的权值*/
void NetWeight(int m, int e[10][10]) {
    int t1, t2, t3;
    printf("请输入边的权值:\n");
    for (int i = 1; i <= m; i++) {
        scanf("%d %d %d", &t1, &t2, &t3);
        e[t1][t2] = t3;
    }
}


/*Floyd 核心代码*/
void Floyd(int n, int e[10][10]) {
    int k, j, i;
    for (k = 1; k <= n; k++)
        for (i = 1; i <= n; i++)
            for (j = 1; j <= n; j++)
                if (e[i][j] > e[i][k] + e[k][j] && e[i][k] < inf && e[k][j] < inf)
                    e[i][j] = e[i][k] + e[k][j];
}

算法复杂度:O( N 3 N^3 N3),可以处理带有负权边的图,但不能处理带有”负权回路(负权环)”的图。


有错误请不吝赐教!!谢谢:)

你可能感兴趣的:(数据结构)