Cod sursa(job #2040999)

Utilizator DavidLDavid Lauran DavidL Data 16 octombrie 2017 19:28:49
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <fstream>
#include <cstring>
#include <vector>
#include <queue>
#define MAX 50005
#define INF 100000000
using namespace std;
ifstream fi("distante.in");
ofstream fo("distante.out");

int t;
int good[MAX],dist[MAX];
bool viz[MAX];
vector <pair<int,int>> G[MAX];
int main()
{
    fi>>t;
    while (t--)
    {
        int n,m,s;
        fi>>n>>m>>s;
        for (int i=1; i<=n; i++)
            fi>>good[i];
        for (int i=1; i<=n; i++)
            G[i].clear();
        for (int i=1; i<=m; i++)
        {
            int u,v,c;
            fi>>u>>v>>c;
            G[u].push_back({v,c});
            G[v].push_back({u,c});
        }
        for (int i=1; i<=n; i++)
            dist[i]=INF;
        dist[s]=0;
        memset(viz,0,sizeof(viz));
        priority_queue <pair<int,int>> Q;
        Q.push({0,s});
        while (!Q.empty())
        {
            int nod=Q.top().second;
            Q.pop();
            if (viz[nod])
                continue;
            viz[nod]=1;
            for (auto vecin: G[nod])
                if (dist[nod]+vecin.second<dist[vecin.first])
                {
                    dist[vecin.first]=dist[nod]+vecin.second;
                    Q.push({-dist[vecin.first],vecin.first});
                }
        }
        bool ok=1;
        for (int i=1; i<=n; i++)
            if (dist[i]!=good[i])
                {ok=0; break;}
        if (ok)
            fo<<"DA\n";
        else
            fo<<"NU\n";
    }

    return 0;
}