예제 #1
0
int dijkstra::check(graph& G)
{
    if ((s == node()) || (!weights_set))
    {
	return GTL_ERROR;
    }

    bool source_found = false;
    graph::node_iterator node_it;
    graph::node_iterator nodes_end = G.nodes_end();
    for (node_it = G.nodes_begin(); node_it != nodes_end; ++node_it)
    {
	if (*node_it == s)
        {
	    source_found = true;
	    break;
	}
    }
    if (!source_found)
    {
	return(GTL_ERROR);
    }

    graph::edge_iterator edge_it;
    graph::edge_iterator edges_end = G.edges_end();
    for(edge_it = G.edges_begin(); edge_it != edges_end; ++edge_it)
    {
	if (weight[*edge_it] < 0.0)
	{
	    return false;
	}
    }

    return GTL_OK;
}
예제 #2
0
void dijkstra::init(graph& G)
{
    dist.init(G, -1.0);
    mark.init(G, black);
    
    if (preds_set)
    {
	pred.init(G, edge());
	graph::node_iterator node_it;
	graph::node_iterator nodes_end = G.nodes_end();
	for (node_it = G.nodes_begin(); node_it != nodes_end; ++node_it)
	{
	    shortest_path_node_list[(*node_it)].clear();
	    shortest_path_edge_list[(*node_it)].clear();
	}
    }
}