Что не так с моим алгоритмом Дейкстры

Так что я работаю над этим часами, и я очень расстроен. Я не понимаю, что я делаю неправильно.

Я использую алгоритм Дейкстры для поиска кратчайших путей между исходной вершиной и четырьмя другими вершинами, используя матрицу смежности. Идея заключается в том, что есть 5 городов и рейсов в них и из них, и мне нужно найти самую дешевую цену билета с учетом пересадок.

Я слежу за алгоритмом из моей книги, который представлен в виде псевдокода, и кодом на следующем веб-сайте: http://vinodcse.wordpress.com/2006/05

Проблема, с которой я сталкиваюсь, заключается в том, что во вложенном цикле for на веб-сайте счетчик i начинается с 1, и я считаю, что это причина, по которой расстояния от исходной вершины ко всем вершинам верны, кроме первой, которая не изменилась и имеет номер 999.

Пример:

Текущее расстояние: 999 220 0 115 130

Предшественники: 0 3 0 2 2

Все эти расстояния верны, даже если я изменю исходную вершину, кроме первой, которая остается неизменной.

Если я изменю счетчик i на 0, он испортит каждое расстояние, т.е.

Текущее расстояние: 0 105 0 0 0

В любом случае, пожалуйста, помогите. Вот соответствующий код.

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;
}

person Steve's a D    schedule 05.12.2011    source источник
comment
Проверьте свою матрицу смежности. Действительно ли вершина 0 связана с другими?   -  person Alex Deem    schedule 05.12.2011
comment
Да, я распечатываю матрицу смежности, и она совпадает с той матрицей, которую нам дал наш профессор для проверки (и с данными).   -  person Steve's a D    schedule 05.12.2011
comment
Я почти уверен, что он прав и что проблема в данных или в расшифровке алгоритма. Верьте ему!   -  person mozillanerd    schedule 05.12.2011


Ответы (1)


Разве эта проверка не должна

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

сделать с adjecencyMatrix[v][i][0].ticketPrice, как и остальные сравнения?

Если adjecencyMatrix[v][i] является массивом, он преобразуется в указатель, и этот указатель всегда будет сравниваться больше, чем 0. Распад массива к указателю снова поражает :)

person R. Martinho Fernandes    schedule 05.12.2011
comment
Спасибо еще раз! Ценю это так много - person Steve's a D; 05.12.2011