求最小生成树(仅用函数,数组,指针)

#include <stdio.h>

int a[5][5], b[5][5]/*缓冲数组*/, c[5][5] = {0}/*储存最终结果用的矩阵*/;
int huilu(int, int);

int main() {
    int i, j, k, l=0, m=0, min;
    for (i = 0; i < 5; i++) {
        for (j = 0; j < 5; j++) {
            scanf("%d", &a[i][j]);
        }
    }/*输入赋权图,且一条边的权要在v1出v2入和v2出v1入两个点上各输入一次*/
    for (i = 0; i < 5; i++) {
        for (j = 0; j < 5; j++) {
            b[i][j] = a[i][j];
        }
    }/*为缓冲数组赋值*/
    for (i = 0; i < 5; i++) {
        for (j = 0; j < 5; j++) {
            min = b[0][0];
            for (i = 0; i < 5; i++) {
                for (j = 0; j < 5; j++) {
                    if (b[i][j] < min) {
                        min = b[i][j];
                        l = i;
                        m = j;
                    }
                }
            }/*找到赋权图中权最小的边*/
            if (huilu(l, m)) {
                c[l][m] = b[l][m]; /*将找到的最小边存到结果数组中去*/
            }
            b[l][m] = 99999; /*破坏掉该最小边,避免接下来影响查找,因此权只能输入小于99999的数*/
        }
    }
    for (i = 0; i < 5; i++) {
        for (j = 0; j < 5; j++) {
            printf("%d", c[i][j]); /*将求好的最小生成树打印出来*/
        }
        printf("\n");
    }
    return 0;
}


int huilu(int l, int m) {
    int  d[5][5], e[5][5] = {0}, i, j, k, o, q = 0;
    for (j = 0; j < 5; j++) {
        for (k = 0; k < 5; k++) {
            d[k][j] = c[k][j];
        }
    }
    for (i = 0; i < 4; i++) {
        for (j = 0; j < 5; j++) {
            for (k = 0; k < 5; k++) {
                for (o = 0; o < 5; o++) {
                    e[k][j] += d[o][j] * c[k][o];
                }
            }
        }/*求矩阵c的可达性矩阵*/
        for (j = 0; j < 5; j++) {
            for (k = 0; k < 5; k++) {
                d[k][j] = e[k][j];
            }
        }
    }
    if (d[l][m] == 0) {
        q = 1;
    }/*如果b[l][m]将要存的点在可达矩阵中值为零,则在该点存值不会造成回路*/
    return q;
}

img


输入后没有结果输出
能不能在不改变总体算法的情况下帮忙改一下。