dijistra算法

246 阅读1分钟

WechatIMG873.jpeg

#define W  100
#define H  100
#define INF  0x3f3f3f3f
#define SIZE  6
int matrix[W][H];
int dist[SIZE] = {0};
int prev[SIZE] = {0};
void printv(int v) {
    if(v>1000) {
        printf("AA ");
    } else {
        printf("%02d ",v);
    }
}


void init(){
    memset(matrix, INF, sizeof(matrix));
    matrix[0][1]=1;
    matrix[0][2]=12;
    
    matrix[1][2]=9;
    matrix[1][3]=3;
    
    matrix[2][4]=5;

    matrix[3][4]=13;
    matrix[3][5]=17;

    matrix[4][5]=4;

    printf("\n");

    for(int i=0;i<SIZE;i++) {
        for(int j=0;j<SIZE;j++) {
            printv(matrix[i][j]);
        }
        printf("\n");
    }
}

void dijistra() {
    //取出矩阵第一行的值
    for (int i=0; i<SIZE; i++) {
        dist[i] = matrix[0][i];
    }

    int index = 0;
    //节点访问标记
    int flag[SIZE] = {0};
    
    for (int i=1; i<SIZE; i++) {
        int min = INF;
        for (int j=0; j<SIZE; j++) {
            if(flag[j]==0 && dist[j] < min) {
                index = j;
                min = dist[j];
            }
        }
        flag[index] = 1;
        printf("\n节点:%d\n",index);

        for (int j=0; j<SIZE; j++) {
            int tmp = matrix[index][j] == INF ? INF : matrix[index][j] + min;

            if(flag[j] == 0 && tmp < dist[j]) {
                dist[j] = tmp;
                prev[j] = index;
            }
        }

        printf("\n");
        for (int k=0; k<SIZE; k++) {
            printv(dist[k]);
        }
        printf("\n");
    }
}

void print_all_path() {
    for(int i=1;i<SIZE;i++) {
        printf("\n节点:%d,距离%d,前置节点:%d,路径:", i, dist[i], prev[i]);
        int node = i;
        int arr[SIZE] = {0};

        int j=0;
        while(prev[node]) {
            arr[j++] = prev[node];
            node = prev[node];
        }
        for (;j>=0; j--) {
            printf("%d->", arr[j]);
        }
        printf("%d", i);
    }
}

void test() {
    init();
    dijistra();
    print_all_path();
}

int main()
{
    test();
    return 0;
}