Выпуск алгоритма Дейкстры [репост]

Я понял, что не могу публиковать ответы на свои вопросы из-за своей низкой репутации или чего-то еще, поэтому я удалил свой старый вопрос и снова его повторяю. Я изменил некоторые вещи и до сих пор не могу получить то, что я ищу.

Вот большая часть кода
Я упустил некоторые из более простых реализаций, таких как части класса pathFinder, потому что я точно знаю, что они работают, поэтому вы будете видеть playerVertex и время просто случайно.
В примере они использовали функцию lowerKey, я не уверен, что это то, что мне не хватает? Я здесь новичок, поэтому конструктивная критика приветствуется. (надеюсь, как можно вежливее) LOL. Моя проблема заключается в печати пути, я снова и снова получаю петлю из одних и тех же двух значений.

class Heap
{
public: Heap();
~Heap();
void insert(double element);
double  deletemin();
void print();
int size(){return heap.size();}private:
int currentIndex;
int left(int parent);
int right(int parent);
int parent(int child);
void heapifyup(int index);
void heapifydown(int index);
private:
vector<double> heap;
};

Heap::Heap()
{
currentIndex = 0;
}
Heap::~Heap()
{}

void Heap::insert(double element)
{
heap.push_back(element);
currentIndex++;
heapifyup(heap.size() - 1);
}

double Heap::deletemin()
{
double min = heap.front();
heap[0] = heap.at(heap.size()-1);
heap.pop_back();
heapifydown(0);
currentIndex--;
return min;
}
void Heap::print()
{
vector<double>::iterator pos = heap.begin();
cout << "Heap = ";
while ( pos != heap.end() )
{
cout << *pos;
++pos;
cout << endl;
}
}
void Heap::heapifyup(int index)
{while((index>0) && (parent(index) >=0) && (heap[parent(index)] > heap[index]))
{
double tmp = heap[parent(index)];
heap[parent(index)] = heap[index];
heap[index] = tmp;
index = parent(index);}
}

void Heap::heapifydown(int index)
{int child = left(index);

if((child > 0) && (right(index) > 0) && (heap[child]>heap[right(index)]))
{
child = right(index);

}
if(child > 0)
{
double tmp = heap[index];
heap[index] = heap[child];
heap[child] = tmp;
heapifydown(child);
}
}

int Heap::left(int parent)
{
int i = ( parent <<1) + 1;
return(i<heap.size()) ? i : - 1;
}

int Heap::right(int parent)
{
int i = ( parent <<1) + 2;
return(i<heap.size()) ? i : - 1;
}

int Heap::parent(int child)
{
if(child != 0)
{
int i = (child - 1) >>1;
return i;
}
return -1;
}class pathFinder : public weightedGraph
{

private:

vertex* playerVertex;
double time;public:
string source;
pathFinder()
{
playerVertex = NULL;
time = 0;

}void Dijkstra(int s,int t)
{
vertex *verts = findVertex(grid[s][t]);
Heap H;
for each(vertex *v in vertexList)
{

if(v->data == verts->data)
{
verts->distance = 0;
verts->pred = NULL;
}
v->distance = INFINITY;
v->pred = NULL;
H.insert(v->data);
}
while(H.size() != 0)
{

vertex *x = findVertex(H.deletemin());

for each(edge *v in x->adjacencyList)
{

if(v->end->visited != true)
{
relax(x,v->end);
v->end->visited = true;
}
else
break;

}

}
}void relax(vertex *a, vertex *b)
{

if(a->distance + weightFrom(a,b) > b->distance)
{
b->distance = a->distance + weightFrom(a,b);
b->pred = a;
}}void printPath(double dest,double dest1)
{
vertex *verta = findVertex(dest);
while(verta->pred->data != dest1)
{
cout<<verta->data<<endl;
verta = verta->pred;
}
}

и я не уверен, что путь печати таков. Я просто использовал путь печати из алгоритма BFS, который я реализовал ранее.

0

Решение

Где в вашем printPath функция вы ищете конец списка?

Вы продолжаете идти verta = verta->pred пока данные не равны некоторому значению.

Кстати, не сравнивайте двойные числа на равенство, так как этого не произойдет. Увидеть Что каждый ученый должен знать о плавающей точке.

Что происходит, когда вы делаете один шаг с отладчиком?
(Попробуйте нарисовать ссылки и как их пройти.)

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector