Cod sursa(job #3188294)

Utilizator AdrianRosuRosu Adrian Andrei AdrianRosu Data 2 ianuarie 2024 16:30:51
Problema Sate Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <bits/stdc++.h>
#define DIM 100001

using namespace std;

ifstream fin("tollroads.in");

ofstream fout("tollroads.out");

vector < pair <int, int> > G[DIM];

int dp[DIM];

int i, n, m, Q, x, y, z;

struct nod{

    int value, node;

    bool operator < (nod x) const{

        return (x.value < value);

    }

};

nod temp;

int Dijkstra(int source, int limit){

    queue <nod> Queue;

    for(i=1;i<=n;i++)

        dp[i] = 1e9;

    dp[source] = 0;

    Queue.push({0, source});

    while(!Queue.empty()){

        int node = Queue.front().node;

        int cost = Queue.front().value;

        Queue.pop();

        if(cost >= limit)

            continue;

        if(dp[node] != cost)

            continue;

        for(int i = 0 ; i < G[node].size() ; i++){

            if(dp[G[node][i].first] > dp[node] + G[node][i].second){

                dp[G[node][i].first] = dp[node] + G[node][i].second;

                temp.node = G[node][i].first;

                temp.value = dp[G[node][i].first];

                Queue.push(temp);

            }

        }

    }

    int answer = 0;

    for(i=1;i<=n;i++)

        if(dp[i] <= limit)

            answer++;

    return --answer;

}

int main(){

    fin >> n >> m >> Q;

    while(m--){

        fin >> x >> y >> z;

        G[x].push_back(make_pair(y, z));

        G[y].push_back(make_pair(x, z));

    }

    while(Q--){

        fin >> x >> y;

        fout << Dijkstra(x, y) << "\n";

    }

    return 0;

}