Cod sursa(job #3198614)

Utilizator not_anduAndu Scheusan not_andu Data 29 ianuarie 2024 21:14:08
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <bits/stdc++.h>

using namespace std;

#define INFILE "distante.in"
#define OUTFILE "distante.out"

const int N_MAX = 5 * 1e4 + 5;
const int INF = 1e9;

struct Node {

    int node;
    int price;

    Node() : node(0), price(0) {}
    Node(int _node, int _price) : node(_node), price(_price) {}

    bool operator<(const Node &other) const {
        return (this -> price > other.price);
    }

};

int nodes, edges, source;
vector<Node> adj[N_MAX];
int expected[N_MAX];
int dist[N_MAX];

void djikstra(int source){

    for(int i = 1; i <= nodes; ++i) dist[i] = INF;

    dist[source] = 0;
    priority_queue<Node> q;
    q.push(Node(source, 0));

    while(!q.empty()){
        
        int node = q.top().node;
        int price = q.top().price;

        q.pop();

        if(price != dist[node]) continue;

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

            Node to = adj[node][i];

            if(price + to.price < dist[to.node]){
                dist[to.node] = price + to.price;
                q.push(Node(to.node, dist[to.node]));
            }

        }

    }

}

void solve(){

    memset(expected, 0, sizeof expected);
    adj->clear();

    cin >> nodes >> edges >> source;

    for(int i = 1; i <= nodes; ++i){
        cin >> expected[i];
    }

    for(int i = 0; i < edges; ++i){
        int node1, node2, price; cin >> node1 >> node2 >> price;
        adj[node1].push_back(Node(node2, price));
    }

    djikstra(source);

    bool ok = true;
    for(int i = 1; i <= nodes && ok; ++i){
        if(dist[i] != expected[i]) ok = false;
    }

    cout << (ok == true ? "YES" : "NO") << '\n';

}

int main(){
    ios_base::sync_with_stdio(false);
    freopen(INFILE, "r", stdin);
    freopen(OUTFILE, "w", stdout);
    cin.tie(0), cout.tie(0);
    int tests; cin >> tests;
    for(int i = 0; i < tests; ++i) solve();
    return 0;
}