Cod sursa(job #2117262)

Utilizator raulrusu99Raul Rusu raulrusu99 Data 28 ianuarie 2018 18:43:51
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
#define N_MAX 50005
int n, m, dist[N_MAX], rez[N_MAX];
void dijkstra(int start, vector <pair<int, int> > G[])
{
    priority_queue <pair<int, int> > pq;
    bool viz[N_MAX] ={0};
    for(int i = 1; i <= n; i++)
        dist[i] = (1 << 31) - 1;
    dist[start] = 0;
    pq.push({0,start});
    while(!pq.empty())
    {
        pair<int, int> _top = pq.top();
        pq.pop();
        int nod = _top.second;
        if(viz[nod])
           continue;
        viz[nod] = 1;
        for(auto it:G[nod])
            if(dist[nod] + it.second < dist[it.first])
            {
                dist[it.first] = dist[nod] + it.second;
                pq.push(make_pair(-dist[it.first], it.first));
            }
    }
}

bool verif()
{
    for(int i = 1; i <= n; i++)
        if(rez[i] != dist[i]) return 0;
    return 1;
}
int main()
{
    int nod, k;
    f >> k;
    while(k--)
    {
        f >> n >> m >> nod;
        for(int i = 1; i<= n; i++)
            f >> rez[i];
        int x, y, z;
        vector <pair<int, int> > G[N_MAX];
        for(int i = 1; i <= m; i++)
        {
            f >> x >> y >> z;
            G[x].push_back(make_pair(y, z));
            G[y].push_back(make_pair(x, z));
        }
        dijkstra(nod, G);
        if(verif()) g << "DA\n";
        else g << "NU\n";
    }
    return 0;
}