Neighbors find_neighbors_bruteforce_impl(const RandomAccessIterator& begin, const RandomAccessIterator& end, Callback callback, IndexType k) { timed_context context("Distance sorting based neighbors search"); typedef std::pair<RandomAccessIterator, ScalarType> DistanceRecord; typedef std::vector<DistanceRecord> Distances; Neighbors neighbors; neighbors.reserve(end-begin); for (RandomAccessIterator iter=begin; iter!=end; ++iter) { Distances distances; for (RandomAccessIterator around_iter=begin; around_iter!=end; ++around_iter) distances.push_back(std::make_pair(around_iter, callback.distance(iter,around_iter))); std::nth_element(distances.begin(),distances.begin()+k+1,distances.end(), distances_comparator<DistanceRecord>()); LocalNeighbors local_neighbors; local_neighbors.reserve(k); for (typename Distances::const_iterator neighbors_iter=distances.begin(); neighbors_iter!=distances.begin()+k+1; ++neighbors_iter) { if (neighbors_iter->first != iter) local_neighbors.push_back(neighbors_iter->first - begin); } neighbors.push_back(local_neighbors); } return neighbors; }
int main () { std::cout << "Graph example program " << " - find shortest path in a directed graph." << std::endl; static const char pendleton[] = "Pendleton"; static const char pensacola[] = "Pensacola"; static const char peoria[] = "Peoria"; static const char phoenix[] = "Phoenix"; static const char pierre[] = "Pierre"; static const char pittsburgh[] = "Pittsburgh"; static const char princeton[] = "Princeton"; static const char pueblo[] = "Pueblo"; Cities cityMap; cityMap[pendleton][phoenix] = 4; cityMap[pendleton][pueblo] = 8; cityMap[pensacola][phoenix] = 5; cityMap[peoria][pittsburgh] = 5; cityMap[peoria][pueblo] = 3; cityMap[phoenix][peoria] = 4; cityMap[phoenix][pittsburgh] = 10; cityMap[phoenix][pueblo] = 3; cityMap[pierre][pendleton] = 2; cityMap[pittsburgh][pensacola] = 4; cityMap[princeton][pittsburgh] = 2; cityMap[pueblo][pierre] = 3; Distances dist; shortestDistance (cityMap, pierre, dist); Distances::iterator where; std::cout << "Find the shortest path from : " << pierre << '\n'; for (where = dist.begin (); where != dist.end (); ++where) std::cout << " Distance to: " << (*where).first << ":" << (*where).second << '\n'; std::cout << "End of graph example program" << '\n'; return 0; }