#include #include int numTowns, numRoads, numBases, safeDist; int i, j; int dangerLevel; std::map *Gtowns; bool *Gdanger; bool *GdfsSeen; void DFS(int town, int remDist) { GdfsSeen[town] = true; if (!Gdanger[town]) ++dangerLevel; Gdanger[town] = true; //printf("{%d}", dangerLevel); std::map *roads = &(Gtowns[town]); std::map::iterator iter; for (iter = (*roads).begin(); iter != (*roads).end(); ++iter) { //printf("%d %d %d %d %d-\n", town, iter->first, iter->second, remDist, GdfsSeen[iter->first]); if (!GdfsSeen[iter->first] && iter->second < remDist) { DFS(iter->first, remDist - iter->second); } } } int main() { bool first = true; while (1) { scanf("%d %d %d %d", &numTowns, &numRoads, &numBases, &safeDist); //printf("\n%d %d %d %d\n\n", numTowns, numRoads, numBases, safeDist); if (numTowns == 0) break; if (numBases == 0) continue; if (!first) { putchar('\n'); } first = false; std::map towns[numTowns + 1]; bool danger[numTowns + 1]; bool dfsSeen[numTowns + 1]; for (j = 0; j < numTowns + 1; j++) danger[j] = false; Gtowns = towns; Gdanger = danger; GdfsSeen = dfsSeen; dangerLevel = 0; int townA = 0, townB = 0, dist = 0; for (i = 0; i < numRoads; ++i) { scanf("%d %d %d", &townA, &townB, &dist); towns[townA][townB] = dist; towns[townB][townA] = dist; } for (i = 0; i < numBases; ++i) { for (j = 0; j < numTowns + 1; j++) dfsSeen[j] = false; int base; scanf("%d", &base); //printf("%d", safeDist); DFS(base, safeDist); printf("%d\n", numTowns - dangerLevel); } } return 0; }