Cod sursa(job #2307825)

Utilizator MarianConstantinMarian Constantin MarianConstantin Data 25 decembrie 2018 18:37:17
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <iostream>
#include <fstream>
#include <set>
#include <vector>
#define MAXN 50010

using namespace std;

const int INF = 0x3f3f3f3f;

struct member {
    int node, cost;
    bool operator<(const member& other) const {
        if (cost != other.cost)
            return cost < other.cost;
        return node < other.node;
    }
};

vector<pair<int, int> > edges[MAXN];
set<member> heap;
int t, distances[MAXN], result[MAXN];
ifstream fin("distante.in");
ofstream fout("distante.out");

void clearMemory(int n) {
    for (int i = 1; i <= n; i++) {
        edges[i].clear();
        distances[i] = INF;
    }
    heap.clear();
}

void dijkstra(int s) {
    distances[s] = 0;
    heap.insert({s, 0});
    while (!heap.empty()) {
        int from = heap.begin()->node;
        heap.erase(heap.begin());
        for (auto& it: edges[from]) {
            int to = it.first, cost = it.second;
            if (distances[to] > distances[from] + cost) {
                if (distances[to] != INF) {
                    heap.erase({to, distances[to]});
                }
                distances[to] = distances[from] + cost;
                heap.insert({to, distances[to]});
            }
        }
    }
}

bool verify(int n) {
    for (int i = 1; i <= n; i++)
        if (result[i] != distances[i])
            return false;
    return true;
}

void printSolution(int n) {
    if (verify(n)) {
        fout << "DA\n";
    }
    else {
        fout << "NU\n";
    }
}

void solve() {
    int n, m, t, s, from, to, cost;
    fin >> t;
    for (int k = 0; k < t; k++) {
        fin >> n >> m >> s;
        clearMemory(n);
        for (int i = 1; i <= n; i++)
            fin >> result[i];
        for (int i = 0; i < m; i++) {
            fin >> from >> to >> cost;
            edges[from].push_back(make_pair(to, cost));
        }
        dijkstra(s);
        printSolution(n);
    }
}


int main()
{
    solve();
    return 0;
}