Cod sursa(job #2298816)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 8 decembrie 2018 15:39:36
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>

using namespace std;

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

int N, M, S;
int dists[50005];
vector < pair<int, int> > g[50005];
bool visited[50005];

void BFS(int startNode)
{
    if(dists[startNode] != 0)
    {
        fout << "NU\n";
        return ;
    }

    memset(visited, 0, sizeof(visited));

    queue <int> q;
    q.push(startNode);

    while(!q.empty())
    {
        int currentNode = q.front();
        q.pop();

        for(auto it : g[currentNode])
        {
            if(visited[it.first] != true)
            {
                if(dists[currentNode] + it.second < dists[it.first])
                    {
                        fout << "NU\n";
                        return ;
                    }

                visited[it.first] = true;
                q.push(it.first);
            }
        }
    }

    fout << "DA\n";
}

void Solve()
{
    fin >> N >> M >> S;

    for(int i = 1; i <= N; i++)
        fin >> dists[i];

    int x, y, c;
    for(int i = 1; i <= M; i++)
    {
        fin >> x >> y >> c;
        g[x].push_back(make_pair(y, c));
    }

    BFS(S);
}

int main()
{
    int T;
    fin >> T;

    while(T--)
        Solve();

    return 0;
}