Cerința
N orașe sunt conectate între ele prin M autostrăzi bidirecționale, fiecare autostradă (a, b) având un cost de tranzit c atașat. Se dorește revizuirea sistemului de taxare, însă sunt câteva aspecte ce trebuie luate în calcul și necesită investigație, deoarece o parte dintre cele N orașe sunt centre comerciale sau turistice importante.
Se dorește să se afle răspunsul la o serie de Q întrebări de forma: (X, T) – câte dintre celelalte N-1 orașe, au acces către orașul X, cu o taxă totală de cel mult T către fiecare oraș?
Date de intrare
Fișierul de intrare tollroads.in conține pe primul rând numerele N, M și Q reprezentând numărul de orașe, numărul de autostrăzi și numărul de interogări. Pe fiecare din următoarele M rânduri sunt scrise câte trei numere a, b, c, separate prin câte un spațiu, reprezentând două orașe între care există o autostradă și costul autostrăzii. Pe următoarele Q rânduri se află scrise câte două numere X și T, separate prin spațiu, reprezentând datele interogărilor, conform enunțului.
Date de ieșire
În fișierul de ieșire tollroads.out se vor scrie pe fiecare dintre primele Q rânduri câte un singur număr, reprezentând răspunsurile la interogări, în ordinea în care ele au fost puse.
Restricții și precizări
1 ≤ N ≤ 100.0001 ≤ M ≤ 100.0001 ≤ a, b ≤ N1 ≤ c ≤ 100.0001 ≤ T ≤ 100.0001 ≤ Q ≤ 100- între orice două orașe poate exista mai mult de o autostrada
Exemplu
tollroads.in
7 8 5 1 2 1 2 3 2 2 4 4 3 5 1 4 5 1 5 6 2 1 6 5 6 7 1 1 6 1 5 1 4 2 3 4 4
tollroads.out
6 5 3 3 5
Explicație
Orașele 2,3,4,5,6,7 au acces către orașul 1 cu taxă maximă 6
Orașele 2,3,4,5,6 au acces către orașul 1 cu taxă maximă 5
Orașele 2,3,5 au acces către orașul 1 cu taxă maximă 4
Orașele 1,3,5 au acces către orașul 2 cu taxă maximă 3
Orașele 2,3,5,6,7 au acces către orașul 4 cu taxă maximă 4
#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
ifstream cin("tollroads.in");
ofstream cout("tollroads.out");
int n, m, k, X, t, P[100001];
vector<vector<pair<int, int>>> G(100001);
int BFS(int nod){
queue<int> Q;
Q.push(nod);
P[nod] = 0;
while(!Q.empty()){
int nod1 = Q.front();
for(auto x:G[nod1]){
int y = x.first;
int c = x.second;
if(P[y] > P[nod1] + c && P[nod1] + c <= t)
P[y] = P[nod1] + c, Q.push(y);
}
Q.pop();
}
int c = 0;
for(int i = 1; i <= n; ++i){
if(P[i] <= t)
c++, P[i] = inf;
}
return c-1;
}
int main(){
cin >> n >> m >> k;
int a, b, c;
for(int i = 1; i <= m; ++i)
cin >> a >> b >> c, G[a].push_back({b, c}), G[b].push_back({a, c});
for(int i = 1; i <= n; ++i)
P[i] = inf;
for(int i = 1; i <= k; ++i){
cin >> X >> t;
cout << BFS(X) << '\n';
}
return 0;
}