#include #include #include using namespace std; void spread(unsigned from, unsigned d, std::vector & sick, std::vector< std::vector > > &cityMap) { std::vector toVisit; for (std::vector >::iterator i=cityMap[from].begin(); i != cityMap[from].end(); ++i) { if (i->second <= d) { sick[i->first] = d; toVisit.push_back(i->first); } } for (std::vector::iterator i = toVisit.begin(); i != toVisit.end(); ++i) { spread(*i, d-1, sick, cityMap); } } int main(int argc, char *argv[]) { while (1) { unsigned cityCnt, pathCnt, baseCnt, dist; cin >> cityCnt; cin >> pathCnt; cin >> baseCnt; cin >> dist; if ((cityCnt + pathCnt + baseCnt +dist) == 0) break; std::vector sick(cityCnt+1, 0); std::vector< std::vector > > cityMap(cityCnt+1); for (unsigned i = 0; i> from; cin >> to; cin >> d; //cout << from << " " << to << endl; cityMap[from].push_back(make_pair(to,d)); cityMap[to].push_back(make_pair(from, d)); } for (unsigned i = 0; i < baseCnt; ++i) { int cityNo; cin >> cityNo; //cout << cityNo << endl; sick[cityNo] = dist; spread(cityNo, dist-1, sick, cityMap); unsigned ok = 0; for (std::vector::iterator j = sick.begin()+1; j!=sick.end(); ++j) if (*j==0) ++ok; cout << ok << endl; } cout << endl; //std::string s; //cin >> s; //cout << cityCnt << " " << pathCnt << " " << baseCnt << " d:" << dist << endl; //cout << "'" << s << "'" << endl; //break; } return 0; }