X-Git-Url: https://www.fleuret.org/cgi-bin/gitweb/gitweb.cgi?p=mtp.git;a=blobdiff_plain;f=mtp_graph.cc;h=2cbb33848a3589007528a6e3b1098357dbf3d3df;hp=e69d4d675a6bdd170e81d5819c9035ddbd0c4710;hb=HEAD;hpb=cbe26b67e99f4151dec8cb088e6bfd5561dad7eb diff --git a/mtp_graph.cc b/mtp_graph.cc index e69d4d6..2cbb338 100644 --- a/mtp_graph.cc +++ b/mtp_graph.cc @@ -241,7 +241,7 @@ void MTPGraph::force_positivized_lengths() { } } #ifdef VERBOSE - cerr << __FILE__ << ": residual_error " << residual_error << " max_error " << residual_error << endl; + cerr << __FILE__ << ": residual_error " << residual_error << " max_error " << max_error << endl; #endif } @@ -379,7 +379,7 @@ void MTPGraph::find_best_paths(scalar_t *lengths) { } } -int MTPGraph::retrieve_one_path(Edge *e, Path *path) { +int MTPGraph::retrieve_one_path(Edge *e, Path *path, int *used_edges) { Edge *f, *next = 0; int l = 0, nb_occupied_next; @@ -396,7 +396,9 @@ int MTPGraph::retrieve_one_path(Edge *e, Path *path) { nb_occupied_next = 0; for(f = e->terminal_vertex->leaving_edge_list_root; f; f = f->next_leaving_edge) { - if(f->occupied) { nb_occupied_next++; next = f; } + if(f->occupied && !used_edges[f - _edges]) { + nb_occupied_next++; next = f; + } } #ifdef DEBUG @@ -404,13 +406,10 @@ int MTPGraph::retrieve_one_path(Edge *e, Path *path) { cerr << __FILE__ << ": retrieve_one_path: Non-sink end point." << endl; abort(); } - - else if(nb_occupied_next > 1) { - cerr << __FILE__ << ": retrieve_one_path: Non node-disjoint paths." << endl; - abort(); - } #endif + if(path) { used_edges[next - _edges] = 1; } + e = next; } @@ -490,6 +489,7 @@ void MTPGraph::compute_dp_ordering() { void MTPGraph::retrieve_disjoint_paths() { Edge *e; int p, l; + int *used_edges; for(int p = 0; p < nb_paths; p++) delete paths[p]; delete[] paths; @@ -500,14 +500,21 @@ void MTPGraph::retrieve_disjoint_paths() { } paths = new Path *[nb_paths]; + used_edges = new int[_nb_edges]; + for(int e = 0; e < _nb_edges; e++) { + used_edges[e] = 0; + } p = 0; for(e = _source->leaving_edge_list_root; e; e = e->next_leaving_edge) { - if(e->occupied) { - l = retrieve_one_path(e, 0); + if(e->occupied && !used_edges[e - _edges]) { + l = retrieve_one_path(e, 0, used_edges); paths[p] = new Path(l); - retrieve_one_path(e, paths[p]); + retrieve_one_path(e, paths[p], used_edges); + used_edges[e - _edges] = 1; p++; } } + + delete[] used_edges; }