Пример #1
0
 void addEdge(vertex_t src, vertex_t dst, weight_t weight) {
   if (max(src,dst) >= l.size()) {
     l.resize(max(src, dst) + 1);
   }
   
   l[src].push_back(edge(dst, weight));
 }
void DijkstraComputePaths(vertex_t source,
    const adjacency_list_t &adjacency_list,
    vector<weight_t> &min_distance,
    vector<vertex_t> &previous)
{
    int n = adjacency_list.size();
    min_distance.clear();
    min_distance.resize(n, max_weight);
    min_distance[source] = 0;
    previous.clear();
    previous.resize(n, -1);
    set<pair<weight_t, vertex_t> > vertex_queue;
    vertex_queue.insert(make_pair(min_distance[source], source));
    while (!vertex_queue.empty())
    {
        weight_t dist = vertex_queue.begin()->first;
        vertex_t u = vertex_queue.begin()->second;
        vertex_queue.erase(vertex_queue.begin());
        // Visit each edge exiting u
        const vector<neighbor> &neighbors = adjacency_list[u];
        for (vector<neighbor>::const_iterator it = neighbors.begin(); it != neighbors.end(); it++)
        {
            vertex_t v = it->target;
            weight_t weight = it->weight;
            weight_t distance_through_u = dist + weight;
            if (distance_through_u < min_distance[v])
            {
                vertex_queue.erase(make_pair(min_distance[v], v));
                min_distance[v] = distance_through_u;
                previous[v] = u;
                vertex_queue.insert(make_pair(min_distance[v], v));
            }
        }
    }
}
Пример #3
0
 bool isReachable(vertex_t u, vertex_t v) {
   stack<edge> q;
   q.push(edge(u, 1));
   vector<bool> visited(l.size(), false);
   
   if (u == v) {
     return true;
   }
   
   while (!q.empty()) {
     edge curr = q.top();
     q.pop();
     
     if (visited[curr.target]) {
       continue;
     }
     else {
       visited[curr.target] = true;
     }
     
     if (curr.target == v) {
       return true;
     }
     
     for (auto v = l[curr.target].begin(); v != l[curr.target].end(); v++) {
       q.push(edge(v->target, v->target));
     }
   }
   
   return false;
 }
Пример #4
0
//Shortest length from source to all other vertices
//Output in vector min_distance
void Map::DijkstraComputePaths(int source,
	const adjacency_list_t &adjacency_list,
	std::vector<double> &min_distance,
	std::vector<int> &previous)
{
	int n = adjacency_list.size();
	min_distance.clear();
	min_distance.resize(n, max_weight);
	min_distance[source] = 0;
	previous.clear();
	previous.resize(n, -1);
	std::set<std::pair<double, int> > vertex_queue;
	vertex_queue.insert(std::make_pair(min_distance[source], source));

	while (!vertex_queue.empty())
	{
		double dist = vertex_queue.begin()->first;
		int u = vertex_queue.begin()->second;
		vertex_queue.erase(vertex_queue.begin());

		// Visit each edge exiting u
		const std::vector<neighbor> &neighbors = adjacency_list[u];
		for (std::vector<neighbor>::const_iterator neighbor_iter = neighbors.begin();
		neighbor_iter != neighbors.end();
			neighbor_iter++)
		{
			int v = neighbor_iter->target;
			double weight = neighbor_iter->weight;
			double distance_through_u = dist + weight;
			if (distance_through_u < min_distance[v]) {
				vertex_queue.erase(std::make_pair(min_distance[v], v));

				min_distance[v] = distance_through_u;
				previous[v] = u;
				vertex_queue.insert(std::make_pair(min_distance[v], v));

			}

		}
	}
}
Пример #5
0
void DijkstraComputePaths(vertex_t source,
			  const adjacency_list_t &adjacency_list, 
			  std::vector<weight_t> &min_distance,
			  std::vector<vertex_t> &previous)
{
	int n = adjacency_list.size();
	min_distance.clear();
	min_distance.resize(n, max_weight);
	min_distance[source] = 0;
	previous.clear();
	previous.resize(n, -1);
	std::set<std::pair<weight_t, vertex_t> > vertex_queue;
	vertex_queue.insert(std::make_pair(min_distance[source], source));

	while (!vertex_queue.empty())
	{
		weight_t dist = vertex_queue.begin()->first;
		vertex_t u = vertex_queue.begin()->second;
		vertex_queue.erase(vertex_queue.begin());

		// Visit each edge exiting u
		const std::vector 
Пример #6
0
 void DFS(vertex_t start) {
   stack<edge> q;
   q.push(edge(start, 1));
   vector<bool> visited(l.size(), false);
   
   while (!q.empty()) {
     edge curr = q.top();
     q.pop();
     
     if (visited[curr.target]) {
       continue;
     }
     else {
       visited[curr.target] = true;
     }
     
     cout << curr.target << endl;
     
     for (auto v = l[curr.target].begin(); v != l[curr.target].end(); v++) {
       q.push(edge(v->target, v->target));
     }
   }
 }