2012-07-26 31 views
5

Tôi muốn sử dụng phương pháp tăng cường breadth_first_visit và tôi muốn cung cấp bản đồ màu của riêng mình "bên ngoài". tôi định nghĩa đồ thị như sauBản đồ màu trong đồ thị tăng cường breadth_first_visit

typedef boost::adjacency_list<boost::setS, boost::listS, boost::undirectedS, 
    boost::property<boost::vertex_index_t, int, 
    boost::property<boost::vertex_color_t, boost::default_color_type, 
    Node_t>>> GraphType; 

nơi Node_t là một cấu trúc, xác định các thuộc tính cho các đỉnh. Tuy nhiên, tôi không thể tìm hiểu làm thế nào tôi có thể cung cấp BFS với bản đồ màu của riêng tôi. Tôi muốn lưu trữ các màu đỉnh trong một vectơ, vì vậy định nghĩa của tôi trông giống như

std::vector<boost::default_color_type> colors; 

nhưng tôi không thể tìm ra, cách sử dụng nó cho các bfs.

Cả

boost::breadth_first_search(g, *boost::vertices(g).first, 
    boost::color_map(colors)); 

cũng không

boost::breadth_first_search(g, *boost::vertices(g).first, 
    boost::color_map(&colors[0])); 

đang làm việc. Trong khi lần đầu tiên cung cấp cho tôi một loạt các lỗi trình biên dịch khác nhau (ví dụ: mặc định-int không được hỗ trợ, "boost :: color_traits" sử dụng loại lớp yêu cầu danh sách đối số loại) hủy bỏ biên dịch thứ hai chỉ với C2664: 'boost :: put' không thể chuyển đổi tham số 2 từ 'void *' thành 'ptrdiff_t'.

Vì vậy, câu hỏi đặt ra là: Làm cách nào tôi có thể sử dụng cấu trúc ánh xạ màu của riêng mình. Một câu hỏi bổ sung sẽ là: Làm thế nào tôi có thể nhận được giá trị màu cho một vertex_descriptor cụ thể?

Trả lời

4

Ok, tôi đã sử dụng cách tiếp cận khác nhưng đã giải quyết được vấn đề của mình. Đối với những người đang bối rối như tôi đã về bản đồ màu trong thúc đẩy hoặc những người quan tâm:

Các Loại bản đồ màu sắc, như BFS sử dụng nó là:

typedef boost::property_map<GraphType, boost::vertex_color_t>::type color_map_t; 
color_map_t colorMap; //Create a color map 

này maps vertex_descriptor đến (trong trường hợp của tôi) default_color_type. Cuộc gọi thích hợp để thúc đẩy của BFS sẽ

boost::breadth_first_visit(g, *boost::vertices(g).first, boost::color_map(colorMap)); 

Cho một cấu trúc color_names mà các bản đồ số màu như

const char* color_names[] = {"white", "gray", "green", "red", "black"}; 

ai có thể lặp qua các màu sắc bằng cách duyệt qua tất cả các đỉnh trong đồ thị và sử dụng vertex_descriptor của đỉnh hiện tại làm đối số cho [] -operator trong bản đồ màu:

GraphType::vertex_iterator it, itEnd; 
for (boost::tie(it, itEnd) = boost::vertices(g); it != itEnd; it++) 
{ 
    std::cout << "Color of node " << *it << " is " << color_names[colorMap[*it]] << std::endl; 
} 
+0

01 ''. ')); 'bạn ' không đi qua khách truy cập - chữ ký để chuyển khách truy cập và bản đồ màu là gì? –

+0

phew, thats khá một thời gian dài trước đây;) Tôi đã không thử này ra, nhưng [ở đây] (http://www.boost.org/doc/libs/1_62_0/libs/graph/doc/breadth_first_visit.html) bạn tìm chữ ký thứ hai với một đối số 'BFSVisitor'-class. – AquilaRapax

+0

Tôi nghĩ rằng tôi đã tìm ra nó - nó đang sử dụng chữ ký "có tên đối số". Tôi không biết làm thế nào bạn có nghĩa vụ phải biết tên nào là đối số hợp lệ, nhưng đối với 'breadth_first_search' có vẻ như là' visitor' là một và 'color_map' là một đối số khác. –

Các vấn đề liên quan