/* Darstellung als Ajazenslisten */ #include template bool element_of (std::list& lst, T el) { for (std::list::iterator i = lst.begin (); i != lst.end (); ++i) { if (*i == el) return true; } return false; } template void add_to_list (std::list& lst, T el) { if (!element_of (lst, el)) lst.push_back (el); } template class GraphEdge { private: std::pair p; W m_value; public: GraphEdge (T& a, T& b) : p (a, b) {} T& first () { return p.first; } T& second () { return p.second; } W value () { return m_value; } }; template class GraphNode { private: std::list > next; T data; public: T& get () { return data; } void connect_with (GraphNode* node) { next.push_back (node); } }; template class Graph { private: std::list*> nodes; public: void add_node (GraphNode* node) { nodes.push_back (node); } void add_edge (GraphEdge edge) { } std::list*>::iterator& begin () { return nodes.begin (); } std::list*>::iterator& end () { return nodes.end (); } }; template GraphPath find_path (GraphNode* start, GraphNode* stop) { priorityqueue*> open_nodes; open_nodes.push_back(start); while (!open_nodes.empty ()) { } } /** A wrapper around a node which can hold all the extra information that is needed */ template class DijkstraSearchNode { private: GraphNode* node; GraphNode* parent; bool is_finished; float distance; GraphNode* parent; public: DijkstraSearchNode (GraphNode* n, GraphNode* p) : node (n), parent (p), is_finished (false), distance (0.0f) { } GraphNode* get_node () { return node; } }; template class DijkstraSearch { private: Graph graph; PriorityQueue open_nodes; std::list*> closed_nodes; GraphPath path; public: DijkstraSearch (Graph graph, GraphNode* start, GraphNode* finish) { open_nodes.push (DijkstraSearchNode(start, NULL)); while (!open_nodes.empty ()) { GraphNode* current_node = open_nodes.top (); open_nodes.pop (); if (current_node == finish) return; // Done, we have found a path for (std::list*>::iterator i = current_node.successors.begin (); i != current_node.successors.end (); ++i) { // if (!node_is_finished(*i)) open_nodes.push (DijkstraSearchNode(*i, current_node)); } return; // No path found } } ~DijkstraSearch () { } bool node_is_finished (GraphNode* node) { return element_of (closed_nodes, node); } GraphPath get_path () { return path; } }; // EOF //