fbpx

Problema #2933 – TollRoads – Rezolvari PBInfo

de Mihai-Alexandru

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.000
  • 1 ≤ M ≤ 100.000
  • 1 ≤ a, b ≤ N
  • 1 ≤ c ≤ 100.000
  • 1 ≤ T ≤ 100.000
  • 1 ≤ 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;
}
Comentarii

S-ar putea sa iti placa