/****************************************** Dijkstra algorithm Computes single-source distances for weighted graphs ******************************************/ #include #include #include "EmbedderDefs.h" typedef DistType Word; #define LOOP while(true) /* This heap class is suited to the Dijkstra alg. data[i]=vertexNum <==> index[vertexNum]=i */ class heap { private: int * data; int heapSize; int left(int i) {return 2*i;} int right(int i) {return 2*i+1;} int parent(int i) {return i/2;} bool insideHeap(int i) {return i=0; j--) heapify(j,index,dist); } bool extractMax(int & max, int index[], Word dist[]) { if (heapSize==0) return false; max=data[0]; data[0]=data[heapSize-1]; index[data[0]]=0; heapSize--; heapify(0,index,dist); return true; } void increaseKey(int increasedVertex, Word newDist, int index[], Word dist[]) { if (dist[increasedVertex]<=newDist) return; int placeInHeap=index[increasedVertex]; dist[increasedVertex]=newDist; int i=placeInHeap; while (i>0 && dist[data[parent(i)]]>newDist) { // can write here: greaterPriority(i,parent(i),dist) assign(i,parent(i),index); i=parent(i); } data[i]=increasedVertex; index[increasedVertex]=i; } }; void dijkstra(int vertex, vtx_data * graph, int n, DistType * dist) { int i; const double MAX_DIST=INT_MAX; heap H(n); static int * index = new int [n]; // initial distances with edge weights: for (i=0; i