示例#1
0
 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);
	
	
	
}
示例#3
0
 int topDown(vector<vector<int>> &triangle)
 {
     map<pair<int, int>, int> scratch;
     return minPath(triangle, pair<int, int>( 0, 0 ), scratch);
 }