Cod sursa(job #2168111)

Utilizator whitewolfJon Snow whitewolf Data 14 martie 2018 09:37:38
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <bits/stdc++.h>
#define Nmax 50050
#define INF (1 << 30)

using namespace std;

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

int N, S, a[Nmax], dp[Nmax];
vector < pair < int, int > > L[Nmax];
priority_queue < pair < int, int > > q;
bool used[Nmax];

inline void Solve()
{
    int i, nod, nnod, cost;
    for(i = 1; i <= N; i++)
        dp[i] = INF;
    dp[S] = 0;
    q.push({0, S});
    while(!q.empty())
    {
        nod = q.top().second;
        q.pop();
        if(!used[nod])
        {
            used[nod] = 1;
            for(i = 0; i < L[nod].size(); i++)
            {
                nnod = L[nod][i].first;
                cost = L[nod][i].second;
                if(dp[nnod] > dp[nod] + cost)
                {
                    dp[nnod] = dp[nod] + cost;
                    q.push({-dp[nnod], nnod});
                }
            }
        }
    }
    for(i = 1; i <= N; i++)
        if(a[i] != dp[i])
        {
            fout << "NU\n";
            return;
        }
    fout << "DA\n";
}

int main()
{
    int T, M, i, x, y, c;
    fin >> T;
    while(T--)
    {
        fin >> N >> M >> S;
        for(i = 1; i <= N; i++)
            fin >> a[i];
        for(i = 1; i <= M; i++)
        {
            fin >> x >> y >> c;
            L[x].push_back({y, c});
            L[y].push_back({x, c});
        }
        Solve();
        for(i = 1; i <= N; i++)
        {
            used[i] = 0;
            L[i].clear();
        }
    }
    fin.close();
    fout.close();
    return 0;
}