Ejemplo n.º 1
0
void mbp_dijkstra(graph<key_type,graph_size> &g0, int s, int t,  vector< edge<key_type> > &path)
{
	struct adj_node<key_type>  table[graph_size + 1];
	key_type v_table[graph_size + 1];
	short v_flag[graph_size + 1];
	int v_parent[graph_size + 1];
	key_type v_parent_weight[graph_size + 1];
	vector<int> fringe;
	int i,max_v;
	struct adj_node<key_type>* temp;
	vector<int>::iterator ii,max,ed;
	//get all the edge information from the graph.
	g0.get_adj_table(table);
	for (i = 1; i <= graph_size ; i++) 
	{
		v_table[i] = 0;
		v_flag[i] = UNSEEN;
	}
	v_table[s] = MAX_WEIGHT + 1;
	v_flag[s] = FRINGE;
	fringe.push_back(s);
	while(fringe.size())
	{
		max = fringe.begin();
		ed = fringe.end();
		for (ii = fringe.begin(); ii != ed ; ii++) 
			if  ( v_table[*ii] > v_table[*max])  max = ii;
		max_v = *max;
		if (max_v == t) break;
		fringe.erase(max);
		v_flag[max_v] = INTREE;
		for(temp = table[max_v].adj_v;temp!=NULL;temp = temp->adj_v)
		{
			if (v_flag[temp->name] != INTREE) 
			{
				if (v_flag[temp->name] == UNSEEN) fringe.push_back(temp->name);
				v_flag[temp->name] = FRINGE;
				if ((temp->weight > v_table[temp->name]) && (v_table[max_v] >  v_table[temp->name]))
				{
					v_parent[temp->name] = max_v;
					v_parent_weight[temp->name] = temp->weight;
					v_table[temp->name] = std::min(v_table[max_v],temp->weight);
				}	
			}
		}
	}
	i = t;
	edge<key_type> edge_here;
	while( i != s) 
	{
		edge_here = edge<key_type>(v_parent[i],i,v_parent_weight[i]);
		path.push_back(edge_here);
		i = v_parent[i];
	}
	return;
}
Ejemplo n.º 2
0
void mbp_kruskal(graph<key_type,graph_size> &g0, int s, int t, vector< edge<key_type> > &path)
{
	int i,j,edge_num = 0;
	struct adj_node<key_type>  table[graph_size + 1];
	struct adj_node<key_type>*  tree_edges = table;
	edge<key_type> temp_e,tt;
	vector< edge<key_type> > edges;
	struct adj_node<key_type>* temp;
	int degree[graph_size + 1],set[graph_size + 1];
	//get all the edge information from the graph.
	g0.get_adj_table(table);
	edges.reserve((graph_size + 1) * (1+graph_size));
	heap<edge<key_type>,graph_size*graph_size,value_fun_edge<key_type>,name_fun_edge<key_type>,key_type> h0(false);
	for (i = 1 ; i <= graph_size; i ++ )
	{ 
		for(temp = table[i].adj_v;temp != NULL; temp = temp->adj_v)
		{
				temp_e = edge<key_type>(i,temp->name,temp->weight);
		// Here we use this code to guide the compiler generate conditonal move instruction, which can decrease the 
		// branch misprediction penalty. 
				edges[(temp->name > i) ? edge_num : 0] = temp_e;
				edge_num += (temp->name > i);
		}
	}
	for (i = 1 ; i <= edge_num; i ++ ) h0.insert(edges[i]);
	//make set for all the vertice
	for (i = 1 ; i <= graph_size ; i ++ ) make_set(set,degree,i);
	
	for (i = 1 ; i <= graph_size ; i ++ ) tree_edges[i].adj_v = NULL;
	long edge_count = 0;
	for(i = 0; i < edge_num ; i++ ) 
	{
		temp_e = h0.max();
		h0.del_max();
		if (find(set,temp_e.v1) != find(set,temp_e.v2) )
		{
			edge_count ++;
			set_union(set,degree,temp_e.v1,temp_e.v2);
			adj_node<key_type>* node1 = new adj_node<key_type>(temp_e.v1,temp_e.weight,tree_edges[temp_e.v2].adj_v);
			adj_node<key_type>* node2 = new adj_node<key_type>(temp_e.v2,temp_e.weight,tree_edges[temp_e.v1].adj_v);
			tree_edges[temp_e.v2].adj_v = node1;
			tree_edges[temp_e.v1].adj_v = node2;
		}
		if (edge_count == graph_size - 1 ) break;
	}
	bool v_flag[graph_size + 1];
	for (i = 1 ; i <= graph_size ; i ++ ) v_flag[i] = false;
	v_flag[s] = true;
	find_path<key_type,graph_size>(tree_edges,s,t,v_flag,path);
	return;
}
Ejemplo n.º 3
0
void mbp_dijkstra_heap(graph<key_type,graph_size> &g0, int s, int t,  vector< edge<key_type> > &path)
{
	struct adj_node<key_type>  table[graph_size + 1];
	short v_flag[graph_size + 1];
	int v_parent[graph_size + 1];
	key_type v_parent_weight[graph_size + 1];
	heap<vertex<key_type>,graph_size,value_fun<key_type>,name_fun<key_type>,key_type> fringe(true);
	vertex<key_type> max,v1;
	struct adj_node<key_type>* temp;
	g0.get_adj_table(table);
	for (int i = 1; i <= graph_size ; i++) v_flag[i] = UNSEEN;
	v1 = g0.get_v(s);
	v1.set_key(MAX_WEIGHT + 1);
	v_flag[s] = FRINGE;
	fringe.insert(v1);
	while(fringe.size())
	{
		max = fringe.max();
		if (max.get_name() == t) break;
		for(temp = table[max.get_name()].adj_v;temp!=NULL;temp = temp->adj_v)
				{
			if (v_flag[temp->name] != INTREE)
			{
				if (v_flag[temp->name] == UNSEEN) fringe.insert(g0.get_v(temp->name));
				v_flag[temp->name] = FRINGE;
				if ((temp->weight > (fringe.index(fringe.get_index(temp->name))).get_key() )
				&&  (max.get_key() > (fringe.index(fringe.get_index(temp->name))).get_key() ) )
				{
					v_parent[temp->name] = max.get_name();
					v_parent_weight[temp->name] = temp->weight;
					//Relax
					v1 = fringe.index(fringe.get_index(temp->name));
					v1.set_key(std::min(max.get_key(),temp->weight));
					fringe.modify_at(fringe.get_index(temp->name),v1);
				}	
			}
		}
		v_flag[max.get_name()] = INTREE;
		fringe.del_max();
	}
	int i = t;
	edge<key_type> edge_here;
	while( i != s) 
	{
		edge_here = edge<key_type>(v_parent[i],i,v_parent_weight[i]);
		path.push_back(edge_here);
		i = v_parent[i];
	}
	return;
}