2016-11-02 4 views
1

현재 부스트 그래프 라이브러리로 작업 중입니다. 내 그래프는 사용자 정의 정점과 에지 속성으로 구성부스트 : 최단 경로에서 그래프 만들기

typedef boost::labeled_graph<boost::adjacency_list< boost::listS, boost::vecS, boost::directedS, Vertex, Edge>, int> Graph; Graph g;

내가 가장 짧은 경로 (다 익스트라)을 계산하는 기능이 필요하여 사용자는 하나 또는 여러 개의 시작과 끝 노드를 선택해야합니다. 노드를 선택하고 모든 시작 노드와 끝 노드 사이의 최단 경로를 계산 한 후 새 그래프를 만들어야합니다. 결국 새로운 그래프는 모든 최단 경로에있는 모든 꼭지점/가장자리를 포함해야합니다.

내 생각이었다 :

1 : 나는

typedef std::vector< VertexDescriptor> Path; 

2 종류

의 계산 된 최단 경로의 역 추적을 수행 정점이 이미 새로운 그래프에 포함되어 있다면 확인. (나는 그 중 하나를 처리하는 방법을 몰라), 그래서 만약 내가 새 그래프로 정점을 복사합니다.

3 : 가장자리가 이미 새 그래프에 포함되어 있는지 확인합니다. 그렇다면 새 그래프로 가장자리를 복사합니다.

Graph graphPaths; 
Path::reverse_iterator rit; 
VertexDescriptor lastNode = *path.rbegin(); 

for (rit = path.rbegin(); rit != path.rend(); ++rit) { 
    // Vertex v = 
     // check if vertices already exist in new GraphPath 
    if (graphPaths[indexMap[*rit]] == NULL) { 
     Vertex v = g[indexMap[*rit]]; 
     VertexDescriptor vd = boost::add_vertex(indexMap[*rit], graphPaths); 
     graphPaths[indexMap[*rit]] = v; 
    } 

    // check if edge is already included in new Graph 
     if (!boost::edge(lastNode, *rit, graphPaths).second) { 

     Graph::edge_descriptor ep = boost::edge(lastNode, *rit, g).first; 
     boost::add_edge_by_label(indexMap[lastNode], indexMap[*rit], g[ep], 
      graphPaths); 
     } 

    } 
    lastNode = *rit; 
} 

그래프에서 꼭지점의 존재 여부를 어떻게 확인할 수 있습니까? 프로세스를 개선하거나 문제를 해결할 다른 아이디어가 있습니까?

감사 마이클

답변

1

나는, 원래의 그래프에 filtered_graph 어댑터를하고있는 모든 정점을 필터링 생각 하는데요은/흥미로운 경로에 방문하지 모서리.

그러면 새 그래프를 만들려면 간단합니다. copy_graph입니다.

그래프 유형을 filtered_graphlabeled_graph으로 변경하면 성능 절충에 따라 복사본이 필요하지 않습니다.