Cod sursa(job #1980316)

Utilizator FredyLup Lucia Fredy Data 12 mai 2017 20:37:57
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

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

#define lim 50010
#define inf 1000000010

struct ini{int nod,cost;};
int n,m,s,path[lim],dist[lim];
bool viz[lim];
vector <ini> G[lim];
priority_queue <pair<int,int>> q;



int main()
{
    int t;
    fin>>t;
    while(t--)
    {
        int a,b,c;

        /// citire
        fin>>n>>m>>s;
        for(int i=1; i<=n; i++)
            fin>>dist[i], G[i].clear();
        for(int i=1; i<=m; i++)
        {
            fin>>a>>b>>c;
            G[a].push_back({b,c});
            G[b].push_back({a,c});
        }

        /// initializari
        for(int i=1; i<=n; i++)
            path[i]=inf, viz[i]=false;
        while(!q.empty())
            q.pop();
        path[s]=0;
        q.push(make_pair(0,s));

        /// dijkstra
        while(!q.empty())
        {
            pair <int,int> aux=q.top();
            q.pop();

            if(viz[aux.second])
                continue;
            viz[aux.second]=true;

            for(auto it:G[aux.second])
                if(path[aux.second]+it.cost<path[it.nod])
                {
                    path[it.nod]=path[aux.second]+it.cost;
                    q.push(make_pair(path[it.nod],it.nod));
                }
        }
//
//        for(int i=1; i<=n; i++)
//            fout<<path[i]<<' ';
//        fout<<'\n';
        /// raspuns
        bool ok=true;
        for(int i=1; i<=n && ok; i++)
            if(path[i]!=dist[i])
                ok=false;
        if(ok)
            fout<<"DA\n";
        else
            fout<<"NU\n";

    }

    fin.close();
    fout.close();
    return 0;
}