Cod sursa(job #2854850)

Utilizator ioana0211Ioana Popa ioana0211 Data 21 februarie 2022 20:04:41
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

ifstream fin ("distante.in");
ofstream fout ("distante.out");

#define NMAX 50005
#define infinit (1<<30)-1

int t, n, m, s, a, b, c, dist[NMAX];
vector<pair<int, int>> ad[NMAX]; /// {indice, cost}
priority_queue<pair<int, int>, vector <pair<int, int>>, greater<> > q; ///{cost, indice}
int viz[NMAX], d[NMAX];

void dijkstra (int sursa)
{
    for(int i=1; i<=n; i++)
        viz[i]=0, d[i]=infinit;
    d[sursa]=0;
    q.push({0, sursa});
    while(!q.empty())
    {
        int nod=q.top().second;
        q.pop();
        if(!viz[nod])
        {
            viz[nod]=1;
            for(auto &vecin: ad[nod]){
                if(d[nod]+vecin.second<d[vecin.first]){
                    d[vecin.first]=d[nod]+vecin.second;
                    q.push({d[vecin.first], vecin.first});
                }
            }
        }
    }
    bool ok=1;
    for(int i=1; i<=n; i++)
        if(d[i]!=dist[i])
            ok=0;
    if(ok)
        fout<<"DA\n";
    else
        fout<<"NU\n";
}

int main()
{
    fin>>t;
    for(int i=1; i<=t; i++)
    {
        fin>>n>>m>>s;
        for(int j=1; j<=n; j++)
            fin>>dist[j];
        for(int j=1; j<=NMAX; j++)
            ad[j].clear();
        for(int j=1; j<=m; j++){
            fin>>a>>b>>c;
            ad[a].push_back({b, c});
        }
        dijkstra(s);
    }
    return 0;
}