Cod sursa(job #2818697)

Utilizator PopescuMihneaPopescu Mihnea-Valentin PopescuMihnea Data 16 decembrie 2021 18:31:28
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <climits>
#include <vector>
#define inf INT_MAX-10000
using namespace std;

ifstream f("distante.in");
ofstream g("distante.out");


int main()
{
    int t,n,m,s,i,j;
    f>>t;
    for (i=0; i<t; ++i)
    {
        vector<vector<pair<int,int>>> lista_vecini;
        f>>n>>m>>s;
        lista_vecini.resize(n+1);
        int cf[n+1];
        for (j=1; j<=n; ++j)
            f>>cf[j];
        for (j=0; j<m; ++j)
        {
            int x,y,c;
            f>>x>>y>>c;
            lista_vecini[x].push_back(make_pair(y,c));
            lista_vecini[y].push_back(make_pair(x,c));
        }
        unsigned int i;
        int d[n+1];
        bool viz[n+1];
        priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> coada_noduri;
        for (i=1; i<=n; ++i)
        {
            d[i]=inf;
            viz[i]=false;
        }
        d[s]=0;
        coada_noduri.push(make_pair(0,s));
        while (!coada_noduri.empty())
        {
            int nod=coada_noduri.top().second;
            coada_noduri.pop();
            viz[nod]=true;
            for (int i=0; i<lista_vecini[nod].size(); ++i)
            {
                int nod_dest=lista_vecini[nod][i].first;
                int cost_dest=lista_vecini[nod][i].second;
                if (d[nod]+cost_dest<d[nod_dest] && !viz[nod_dest])
                {
                    d[nod_dest]=d[nod]+cost_dest;
                    coada_noduri.push(make_pair(d[nod_dest],nod_dest));
                }
            }
        }
        bool ok=true;
        for (unsigned int i=1; i<=n; ++i)
        {
            if (d[i]!=cf[i])
            {
                g<<"NU";
                ok=false;
                break;
            }
        }

        if (ok)
            g<<"DA";
        g<<"\n";
    }
}