Taki graf możesz zrealizować np. tak:
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <utility>
struct Node {
std::string city;
std::vector<std::pair<unsigned, unsigned>> connections;
};
int findOrAddCity(std::vector<Node> &g, const std::string &name)
{
for (int i = 0; i < g.size(); ++i)
if(g[i].city == name) return i;
g.push_back({ name, {} });
return g.size() - 1;
}
int main()
{
std::istringstream ifs("A B 1 A C 3 B A 2 C A 666");
std::vector<Node> graph;
std::string n1, n2;
unsigned dist;
while (ifs >> n1 >> n2 >> dist) {
int i1 = findOrAddCity(graph, n1);
int i2 = findOrAddCity(graph, n2);
graph[i1].connections.push_back(std::make_pair(i2, dist));
}
for (auto &i : graph) {
std::cout << i.city << '\n';
for (auto &c : i.connections)
std::cout << '\t' << graph[c.first].city << " dist: " << c.second << '\n';
}
}
Można by oczywiście użyć mapy, ale wydaje mi się, że prościej Ci będzie poruszać się po tablicy indeksami niż nazwami miast.