#include #include #include #include class vertex; class graph; class graph { public: typedef std::vector vertex_vector; typedef vertex_vector::size_type vertex_id; typedef std::map vertex_index; vertex_vector V; vertex_index V_index; std::istream & read(std::istream & input); private: size_t add_vertex(const std::string & name); }; class vertex { public: std::string name; std::vector adj; vertex(const std::string & n) : name(n) {}; }; size_t graph::add_vertex(const std::string & name) { std::pair pib = V_index.insert(vertex_index::value_type(name, V.size())); if (pib.second) V.push_back(vertex(name)); return pib.first->second; } std::istream & graph::read(std::istream & input) { std::string u_name, v_name, edge; while (input >> u_name >> edge >> v_name) { size_t u = add_vertex(u_name); size_t v = add_vertex(v_name); if (edge == "--") { V[u].adj.push_back(v); V[v].adj.push_back(u); } else if (edge == "->") { V[u].adj.push_back(v); } else if (edge == "<-") { V[v].adj.push_back(u); } } return input; }