Cod sursa(job #2040652)

Utilizator zdavid112zIon David-Gabriel zdavid112z Data 16 octombrie 2017 09:46:33
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <bits/stdc++.h>

using namespace std;

struct cmp
{
    cmp(){}
    bool operator()(const pair<int, int>& a, const pair<int, int>& b) const
    {
        return a.first > b.first;
    }
};

vector< pair<int, int> > v[50001];
bool viz[50001];
int dist[50001];
int odist[50001];
priority_queue< pair<int, int>, vector< pair<int, int> >, cmp> q;
int n, m, s;

bool solve()
{
    viz[s] = 1;
    if(odist[s] != 0) return false;
    dist[s] = 0;
    while(!q.empty()) q.pop();
    for(int i = 0; i < v[s].size(); i++)
        q.push(v[s][i]);
    while(!q.empty())
    {
        pair<int, int> p = q.top();
        q.pop();
        if(viz[p.second]) continue;
        if(odist[p.second] != p.first)
            return false;
        viz[p.second] = 1;
        for(int i = 0; i < v[p.second].size(); i++)
        {
            if(!viz[v[p.second][i].second] &&
               dist[v[p.second][i].second] > p.first + v[p.second][i].first)
            {
                int d = p.first + v[p.second][i].first;
                dist[v[p.second][i].second] = d;
                pair<int, int> np = make_pair(d, v[p.second][i].second);
                q.push(np);
            }
        }
    }
    return true;
}

int main()
{
    freopen("distante.in", "r", stdin);
    freopen("distante.out", "w", stdout);
    int t, a, b,c;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d%d%d", &n, &m, &s);
        s--;
        for(int i = 0; i < n; i++)
        {
            scanf("%d", &odist[i]);
            dist[i] = 0x3f3f3f3f;
            v[i].clear();
            viz[i] = 0;
        }
        for(int i = 0; i < m; i++)
        {
            scanf("%d%d%d", &a, &b, &c);
            a--; b--;
            v[a].push_back(make_pair(c, b));
            v[b].push_back(make_pair(c, a));
        }
        if(solve())
            printf("DA\n");
        else printf("NU\n");
    }
    return 0;
}