Question

So I've been working on this for hours and I'm extremely frustrated. I don't understand what I'm doing wrong.

I'm using Dijkstra's Algorithm to find the shortest paths between a source vertex, and 4 other vertices using an adjacency matrix. The idea behind this is that there are 5 cities and flights going to and from them, and I need to find the cheapest ticket price, taking into account layovers.

I'm following the algorithm out of my book, which is in pseudocode, and the code on the following website: http://vinodcse.wordpress.com/2006/05/19/code-for-dijkstras-algorithm-in-c-2/

The problem I'm having is that in the nested for loop on the website, the counter i starts at 1, and I believe this is the reason why the distances from the source vertex to all the vertices are correct, except the first one which is unchanged at 999.

Example:

Current Distance: 999 220 0 115 130

Predecessors: 0 3 0 2 2

All of those distances are correct--even if I change the source vertex--except for the first one which remains unchanged.

If I change the counter i to 0, it messes up every distance, i.e.

Current Distance: 0 105 0 0 0

Anyway, Please help. Here is the relevant code.

void Graph::findDistance(int startingVertex)
{
  for(int i=0; i<MAX;i++)
  {
    currentDistance[i] = 999;
    toBeChecked[i] = 1;
    predecessor[i] = 0; 
  }

  currentDistance[startingVertex]=0;
  bool flag=true;
  int v;
  while(flag)
  {
    v=minimum();

    toBeChecked[v]=0;

    for(int i=1; i<MAX;i++) //here is where i think im going wrong
    {
      if(adjecencyMatrix[v][i]>0)   
      {
        if(toBeChecked[i]!=0)
        {
          if(currentDistance[i] > currentDistance[v]+adjecencyMatrix[v][i][0].ticketPrice)
          {
            currentDistance[i] = currentDistance[v]+adjecencyMatrix[v][i][0].ticketPrice;
            predecessor[i]=v;
          }
        }
      }
    }

    flag = false;
    for(int i=1; i<MAX;i++)
    {
      if(toBeChecked[i]==1)
      flag=true;
    }
  }
}

int Graph::minimum()
{
  int min=999;
  int i,t;
  for(i=0;i<MAX;i++)
  {
    if(toBeChecked[i]!=0)
    {
      if(min>=currentDistance[i])
      {
        min=currentDistance[i];
        t=i;
      }
    }
  }
  return t;
}
Was it helpful?

Solution

Shouldn't this check

  if(adjecencyMatrix[v][i]>0)   

be done with adjecencyMatrix[v][i][0].ticketPrice, like the rest of the comparisons?

If adjecencyMatrix[v][i] is an array, it is getting converted to a pointer, and that pointer will always compare greater than 0. Array-to-pointer decay strikes again :)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top