Jimmy Eklundh
Jimmy Eklundh

Reputation: 23

Dijkstra algorithm

I'm trying to implement dijkstra algorithm in C using double arrays with memory allocation (to solve it ina big big graph), but I can't make it run yet. My code doesn't turn any error, only that all answers are 0. Here it is, if you can i'm also looking for a way to do it without using multiple arrays (dimension matrix).

ADDED TEXTFILE, i keep getting [warning] passing arg 3 of dijkstra from incompatible pointer type

#include <stdio.h>
#define MAX 1000

void dijkstra(int n,int v,int cost[n][n],int dist[n]);

int main()
{
    int n,v, aux, aux1, aux2;

    int arc;
    FILE *archive;
    archive= fopen("TEXTFILE.txt","r");
    fscanf(archive,"%d %d",&n,&arc );
    printf("%d %d \n",n, arc);
    int dist[n];
    int k = 0;
    int rows = n;
    int cols = n;
    int i = 0;
    int j = 0;
    int **cost;
    cost = malloc(rows * sizeof(int));
    for (i = 0; i < rows; i++){
        cost[i] = malloc(cols * sizeof(int));
    }

    while (!feof(archive)){
        fscanf (archivo,"%d %d %d", &aux, &aux1, &aux2);
        cost[aux][aux1] = aux2;
        printf("%d %d %d\n", aux, aux1, cost[aux][aux1]);
        aux = 0 ;
        aux1 = 0;
        aux2 = 0;
    }

    printf("\n Enter the Source Node:");
    scanf("%d",&v);

    int h,u,count,w,flag[n],min;

    for(h=0;h < n;h++)
    {
        flag[h]=0;
        dist[h]=cost[v][h];
    }
    count=1;
    while(count&lt;n)
    {
        min=MAX;
        for(w=0;w < n;w++)
        {
            if(dist[w] < min && !flag[w])
            {
                min=dist[w];
                u=w;
            }
        }
        flag[u]=1;
        count++;
        for(w=0; w < n;w++)
        {
            if((dist[u] + cost[u][w] < dist[w]) && !flag[w])
            {
                dist[w] = dist[u] + cost[u][w];
            }
        }
    }

    printf("\n   Shortest Path from Node %d: ",v);
    printf("\n#################################\n\n");

    for(h=0;h < n;h++)
    {

        printf("Distance to Node:%d is %d\n",(h+1),dist[h]);
    }

    system ("PAUSE");
    return 0;

}

TEXTFILE

10 16
1 2  2 
1 4  8
2 4  4
3 4  3
3 5  4
3 8  8
4 5  7
5 6  2
5 7  2
5 8  4
6 7  1
6 9  2
7 8  1
7 10 4
8 10 4
9 10 1

Upvotes: 2

Views: 1308

Answers (1)

Shashwat Kumar
Shashwat Kumar

Reputation: 5287

The logical error in your code is that you have set the values of cost matrix by reading from the file. But other values are zero by default, so you are always getting min as zero. So the pair of of nodes which don't have path between them are considered as the shortest distance. You need to make these cost INFINITE i.e. some very large value.

for(i = 0;i < n;i++)  
for(j = 0;j < n;j++)  
{
    if(i!=j)
    {
        if(cost[i][j]==0)
        {
            cost[i][j] = INF;
        }
    }
}

Upvotes: 1

Related Questions