int minPath(vector<vector<int>> &triangle, pair<int, int>& cell, map<pair<int, int>, int> &scratch) { if (cell.first == (triangle.size() - 1)) { return triangle[cell.first][cell.second]; } if (scratch.count(cell) == 0) { scratch[cell] = min(minPath(triangle, pair<int, int>(cell.first + 1, cell.second), scratch), minPath(triangle, pair<int, int>(cell.first + 1, cell.second + 1), scratch)) + triangle[cell.first][cell.second]; } return scratch[cell]; }
//OpenMP Implementation of Dijkstra's Algorithm void DijkstraOMP(Vertex *vertices, Edge *edges, int *weights, Vertex *root) { double start, end; root->visited = TRUE; int len[V]; len[(int)root->title] = 0; int i, j; for(i = 0; i < V;i++) { if(vertices[i].title != root->title) { len[(int)vertices[i].title] = findEdge(*root, vertices[i], edges, weights); } else{ vertices[i].visited = TRUE; } } start = omp_get_wtime(); for(j = 0; j < V; j++){ Vertex u; int h = minPath(vertices, len); u = vertices[h]; //OpenMP Parallelization Starts here!!! #pragma omp parallel for schedule(runtime) private(i) for(i = 0; i < V; i++) { if(vertices[i].visited == FALSE) { int c = findEdge( u, vertices[i], edges, weights); len[vertices[i].title] = minimum(len[vertices[i].title], len[u.title] + c); } } } end = omp_get_wtime(); printArray(len); printf("Running time: %f ms\n", (end - start)*1000); }
int topDown(vector<vector<int>> &triangle) { map<pair<int, int>, int> scratch; return minPath(triangle, pair<int, int>( 0, 0 ), scratch); }