#include<iostream.h> #include<limits.h> #include<assert.h> #define max_vertex 100 #define infinite 999999999 typedef struct Node { int vertex,distance; }Node; Node heap[1000000]; int visited[max_vertex]; int heapSize; void Init() { heapSize = 0; heap[0].distance = -INT_MAX; heap[0].vertex = -1; } void Insert(Node element) { heapSize++; heap[heapSize] = element; int now = heapSize; while(heap[now/2].distance > element.distance) { heap[now] = heap[now/2]; now /= 2; } heap[now] = element; } Node DeleteMin() { Node minElement,lastElement; int child,now; minElement = heap[1]; lastElement = heap[heapSize--]; for(now = 1; now*2 <= heapSize ;now = child) { child = now*2; if(child != heapSize && heap[child+1].distance < heap[child].distance ) { child++; } if(lastElement.distance > heap[child].distance) { heap[now] = heap[child]; } else /* It fits there */ { break; } } heap[now] = lastElement; return minElement; } int main() { int graph[max_vertex][max_vertex],size[max_vertex]={0},distance[max_vertex]={0},cost[max_vertex][max_vertex]; int vertices,edges,weight; int iteration; cin>>vertices>>edges; int from,to; for(iteration=0;iteration<edges;iteration++) { cin>>from>>to>>weight; assert(from>=0 && from<vertices); assert(to>=0 && to<vertices); graph[from][size[from]] = to; cost[from][size[from]] = weight; size[from]++; } int source; cin>>source; Node temp; for(iteration=0;iteration<vertices;iteration++) { if(iteration==source) { temp.distance = 0; distance[0]=0; } else { temp.distance = infinite; distance[iteration]= infinite; } temp.vertex = iteration; Insert(temp); } while(heapSize) { Node min = DeleteMin(); int presentVertex = min.vertex; if(visited[presentVertex]) { continue; } visited[presentVertex] = 1; for(iteration=0;iteration<size[presentVertex];iteration++) { int to = graph[presentVertex][iteration]; if(distance[to] > distance[presentVertex] + cost[presentVertex][iteration]) { distance[to] = distance[presentVertex] + cost[presentVertex][iteration]; temp.vertex = to; temp.distance = distance[to]; Insert(temp); } } } for(iteration=0;iteration<vertices;iteration++) { cout<<"vertex is "<<iteration<<" , its distance is "<<iteration,distance[iteration]<<endl; } return 0; }
Tuesday, April 1, 2014
Implementation of Dijkstra's Single Source Shortest Path Algorithm in C++
Labels:
algorithm,
c++,
Dynamic Programming