Cod sursa(job #2461282)

Utilizator Anakin1001George Giorgiu Gica Anakin1001 Data 25 septembrie 2019 12:07:58
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#include <climits>
#define inf INT_MAX
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
int d[50001], x, y, c, Nodes, Arcs, Origin, v[50001], T, test, i, viz[50001];
struct cmp{
    bool operator () (int &a, int &b){
        return d[a] > d[b];
    }
};
vector < pair < int, int > > graph[50001];
priority_queue < int, vector <int>, cmp > heap;
int main()
{   f >> T;
    for(test = 1; test <= T; test++){
        memset(viz, 0, sizeof(viz));
        f >> Nodes >> Arcs >> Origin;
        for(i = 1; i <= Nodes; i++)
            f >> v[i];
        for(i = 1; i <= Arcs; i++){
            f >> x >> y >> c;
            graph[x].push_back({y,c});
            graph[y].push_back({x,c});
        }
        for(i = 1; i <= Nodes; i++)
            d[i] = inf;
        d[Origin] = 0;
        heap.push(Origin);
        while(!heap.empty()){
            if(viz[heap.top()] == 1){
                heap.pop();
                continue;
            }
            int node = heap.top();
            for(i = 0; i < graph[node].size(); i++){
                int new_node = graph[node][i].first;
                int cost = graph[node][i].second;
                if(d[new_node] > d[node] + cost){
                    d[new_node] = d[node] + cost;
                    heap.push(new_node);
                    viz[new_node] = 0;
                }
            }
            viz[node] = 1;
        }
        for(i = 1; i <= Nodes; i++)
            if(d[i] != v[i]){
                g << "NU" << '\n';
                break;
            }
        if(i > Nodes)
            g << "DA" << '\n';
        for(i = 1; i <= Nodes; i++)
            graph[i].clear();
        while(!heap.empty())
            heap.pop();
    }
    return 0;
}