Ik ben op het moment bezig met het dijkstra algoritme in c++ en loop tegen een probleem van de priority queue aan.. het algoritme werkt compleet alleen moet ik tijdens het uitvoeren eerst een invalid head debug assertion failed melding negeren.
Het probleem zit in de overloaded operator die op z'n bek gaat op het moment dat ik w->dist wijzig in de code.
het werkt wel op het moment dat ik de priority queue voor het wijzigen geheel controleer op de aanwezigheid van de te bewerken vertex en deze verwijder en later weer toevoeg. Ik vind dit echter geen mooie oplossing en er moet toch een goede zijn?
Het probleem zit in de overloaded operator die op z'n bek gaat op het moment dat ik w->dist wijzig in de code.
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
| struct CompVertex : public std::binary_function<const Vertex*,const Vertex*, bool> { bool operator()(Vertex * a,Vertex* b) { return b->dist < a->dist; //kunnen we niet controleren.. invalid heap Debug assertion failed //return false; } }; void Graph::dijkstra(string fromId, string toId) { Vertex *vStart = vertexes[fromId]; Vertex *vEnd = vertexes[toId]; priority_queue<Vertex *, vector<Vertex*>, CompVertex> q; map<const string, Vertex *>::iterator it; for( it = vertexes.begin(); it != vertexes.end(); it++ ) { Vertex * v = (*it).second; v->dist = 1000000; v->known = false; v->path = NULL; } vStart->dist = 0; q.push(vStart); while(!q.empty()) { Vertex *temp = q.top(); temp->known = true; q.pop(); for(list<Edge *>::iterator it = temp->adj.begin(); it != temp->adj.end(); it++) { Vertex * w = (*it)->endVertex; if(!w->known) { if((temp->dist + (*it)->weight) < w->dist) { w->dist = temp->dist + (*it)->weight; w->path = temp; //w->known = true; q.push(w); //cout << "top:" << q.top()->id << " "; } } } } Graph::printPath(toId); } |
het werkt wel op het moment dat ik de priority queue voor het wijzigen geheel controleer op de aanwezigheid van de te bewerken vertex en deze verwijder en later weer toevoeg. Ik vind dit echter geen mooie oplossing en er moet toch een goede zijn?