Cod sursa(job #1732669)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 22 iulie 2016 11:24:54
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <cstdio>
#include <vector>
#include <queue>

using namespace std;

const int inf = 2 << 28;

priority_queue<pair<int, int>, vector<pair<int, int> >, less<pair<int, int> > > Q;

int t;
int n, m, s;
vector<pair<int, int> > vecini[50500];
int dist[50500];
int distx[50500]; ///distanta de pe peretii spitalului

void citire()
{
    int tmp1, tmp2, tmp3;

    scanf("%d %d %d", &n, &m, &s);
    s--;

    for(int i = 0; i < n; i++)
    {
        scanf("%d", &tmp1);
        distx[i] = tmp1;

        vecini[i].clear();
        dist[i] = inf;
    }

    for(int i = 0; i < m; i++)
    {
        scanf("%d %d %d", &tmp1, &tmp2, &tmp3);
        tmp1--;
        tmp2--;

        vecini[tmp1].push_back(make_pair(tmp3, tmp2));
    }

    while(!Q.empty())
    {
        Q.pop();
    }
}

void dijkstra()
{
    Q.push(make_pair(0, s));
    dist[s] = 0;

    while(!Q.empty())
    {
        int x = Q.top().second;
        Q.pop();

        int l = vecini[x].size();

        for(int i = 0; i < l; i++)
        {
            if(dist[vecini[x][i].second] > dist[x] + vecini[x][i].first)
            {
                dist[vecini[x][i].second] = dist[x] + vecini[x][i].first;
                Q.push(vecini[x][i]);
            }
        }
    }
}

void afisareValidare()
{
    for(int i = 0; i < n; i++)
    {
        if(dist[i] != distx[i])
        {
            printf("NU\n");
            return;
        }
    }

    printf("DA\n");
}

int main()
{
    freopen("distante.in", "r", stdin);
    freopen("distante.out", "w", stdout);

    scanf("%d", &t);

    for(int i = 0; i < t; i++)
    {
        citire();
        dijkstra();
        afisareValidare();
    }


    return 0;
}