#include #include using namespace std; const int MAX = 1000; const int INF = 10000000; class Edge { public: int cost; int dest; Edge *next; Edge(int c, int d, Edge *n=0) : cost(c), dest(d), next(n) {} }; class Vertex { public: string name; int dist; int len; int prev; bool visited; Edge *adj; Vertex(string s="") : name(s), dist(INF), len(MAX), prev(-1), visited(false), adj(0) {} } vertices[MAX]; int nVerts = 0; void printGraph() { for(int i=0; inext) { cout << " " << vertices[j->dest].name; } cout << endl; } } int getVertex(string s) { for(int i=0; i q; vertices[0].dist = vertices[0].len = 0; q.push(0); while (!q.empty()) { int i = q.front(); q.pop(); if (vertices[i].visited) continue; vertices[i].visited = true; int len = vertices[i].len; int dist = vertices[i].dist; for(Edge *p = vertices[i].adj; p != 0; p = p->next) { int j = p->dest; if (vertices[j].len >= len+1 && vertices[j].dist >= p->cost) { if (vertices[j].len == MAX) { q.push(j); //cout << "inserting " << vertices[j].name << " onto q" << endl; } //cout << "updating " << vertices[j].name << ": " << len+1 << ',' << dist+p->cost << ',' << vertices[i].name << endl; vertices[j].len = len+1; vertices[j].dist = p->cost; vertices[j].prev = i; } } } } int main() { int n, m; string targets[MAX]; cin >> n >> m; getVertex("English"); for(int i=0; i> targets[i]; getVertex(targets[i]); } for(int i=0; i> s1 >> s2 >> cost; addEdge(s1, s2, cost); addEdge(s2, s1, cost); } version3(); int cost = 0; bool noSol = false; for(int i=0; i