我正在尝试为一个类实现dijkstra的算法

时间:2017-09-12 00:47:04

标签: c shortest-path dijkstra

我应该将0-3-6-5作为费用的输出。 -1-0-3-1表示前一个数组的输出。和1-1-1-1访问数组。

我的费用为0-3-7-5,前者为-1-0-1-1。如果可以,请帮忙。

我试图看看7应该是6的时候来自哪里,我不知道它。这是我第一次用C语言编写代码,所以看起来似乎很草率。

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#define infinity 999

int main (void){

    int dij[4][4] = {{0,3,8,6},
        {3,0,4,2},
        {8,4,0,1},
        {6,2,1,0}};

    int visit[4];
    int cost[4];
    int previous[4];

    //filling the visit, cost, previous arrays
    for(int j=0; j<4; j++){
        visit[j] = 0;
        cost[j] = infinity;
        previous[j] = -1;
    }//adding the values to the arrays    
    //node I am on
    cost[0] = 0; //first position in the cost array is set to 0
    int counter = 0; //counter for the while loop    
    int currentRow = 0; //checks for the rows holding th smallest value in the dij array
        while(counter < 4){
                int min = infinity; //min value is set to infinity at the beginning of program            
                for(int y=0; y<4; y++){                   
                    //if the cost at the current position in th cost array is < min and the node is not visited
                    if(cost[y] < min && visit[y] == 0){
                        min = cost[y];
                        currentRow = y;
                    }//if                    
                    visit[currentRow] = 1;
                }//for loop for col of dij array.
                //loop to look at the cost array to find the lowest cost unvisited node and set row to that index value
                for(int x=0; x<4; x++){                    
                    if(visit[x] != 1){             
                        if(min + dij[currentRow][x] < cost[x]){
                            cost[x] = min + dij[currentRow][x];
                            previous[x] = currentRow;
                        }
                    }
                }
                counter++;
        }//while loop for x column of dij array.

1 个答案:

答案 0 :(得分:1)

您的访问标记必须在for语句之外。因为访问标志必须在迭代时间。

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#define infinity 999

int main (void)
{

    int dij[4][4] = {
        {0,3,8,6},
        {3,0,4,2},
        {8,4,0,1},
        {6,2,1,0}
    };

    int visit[4];
    int cost[4];
    int previous[4];

    //filling the visit, cost, previous arrays
    for(int j=0; j<4; j++){
        visit[j] = 0;
        cost[j] = infinity;
        previous[j] = -1;
    }//adding the values to the arrays    

    //node I am on
    cost[0] = 0; //first position in the cost array is set to 0
    int counter = 0; //counter for the while loop    
    int currentRow = 0; //checks for the rows holding th smallest value in the dij array

    while(counter < 4)  
    {
        int min = infinity; //min value is set to infinity at the beginning of program            
        for(int y=0; y<4; y++){                   
            //if the cost at the current position in th cost array is < min and the node is not visited
            if(cost[y] <= min && visit[y] == 0){
                min = cost[y];
                currentRow = y;
            }//if                    

        }//for loop for col of dij array.

        visit[currentRow] = 1;

        //loop to look at the cost array to find the lowest cost unvisited node and set row to that index value
        for(int x=0; x<4; x++){ 

            if(visit[x] != 1 && cost[currentRow] + dij[currentRow][x] < cost[x] && cost[currentRow] != infinity )
            {             
                //if(min + dij[currentRow][x] < cost[x])
                {
                    cost[x] = cost[currentRow] + dij[currentRow][x];
                    previous[x] = currentRow;
                }
            }
        }

        counter++;
    }//while loop for x column of dij array.


    printf("visit   cost    previous  \n");

    for(int j=0; j<4; j++){
        printf("%d \t %d \t %d \n", visit[j], cost[j], previous[j]);
    }//adding the values to the arrays  

    return 0;
}

以下是包含打印值的完整源代码。

visit   cost    previous
1        0       -1
1        3       0
1        6       3
1        5       1

输出应如下,

tar: Truncated input file (needed 1050624 bytes, only 0 available)
tar: Error exit delayed from previous errors.

祝你有愉快的一天~~