// 2011アジア地区予選 D : Long Distance Taxi #include #include #include #include #include using namespace std; class Node{ public: int p, q, c; Node(int p, int q, int c) : p(p), q(q), c(c) {} bool operator < (const Node &nd) const { return c > nd.c; } }; const int INF = 1000000007; typedef vector< vector > graph; vector getCost(const graph &g, int src, int cap){ vector visit(g.size(), false); vector res(g.size(), 10*cap+1); priority_queue< Node > qu; qu.push(Node(src, src, 0)); res[src] = 0; while(!qu.empty()){ Node nd = qu.top(); qu.pop(); int pos = nd.q, cost = nd.c; if(visit[pos]) continue; for(int i=0;i visit(g.size(), false); vector res(g.size(), INF); priority_queue< Node > qu; qu.push(Node(src, src, 0)); res[src] = 0; while(!qu.empty()){ Node nd = qu.top(); qu.pop(); int pos = nd.q, cost = nd.c; if(visit[pos]) continue; for(int i=0;i> N >> M >> cap, N){ string src, dst; cin >> src >> dst; map mp; graph g1(2*N, vector()); int idx = 0; for(int i=0;i> c1 >> c2 >> d; if(!mp.count(c1)) mp[c1] = idx++; if(!mp.count(c2)) mp[c2] = idx++; g1[mp[c1]].push_back(Node(mp[c1], mp[c2], d)); g1[mp[c2]].push_back(Node(mp[c2], mp[c1], d)); } vector LPG(M+2); for(int i=1;i<=M;i++){ string s; cin >> s; LPG[i] = mp[s]; } if(!mp.count(src)){ cout << -1 << endl; continue; } if(!mp.count(dst)){ cout << -1 << endl; continue; } LPG[0 ] = mp[src]; LPG[M+1] = mp[dst]; graph g2(M+2, vector()); for(int i=0;i vi = getCost(g1, LPG[i], cap); for(int j=0;j