Cod sursa(job #2702189)

Utilizator AndreiJJIordan Andrei AndreiJJ Data 3 februarie 2021 10:20:20
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <iostream>
#include <vector>
#include <fstream>
#include <set>
#include <bitset>

using namespace std;

vector <pair <int, int> > L[50005];
set<pair<int, int> > s;
int dist[50005], ans[50005], n, start;

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

void Read()
{
    for (int i = 1; i <= n; i++)
        L[i].clear();
    int m, g;
    fin >> n >> m >> start;
    for (int i = 1; i <= n; i++)
        fin >> ans[i];
    while (m--)
    {
        int x, y, c;
        fin >> x >> y >> c;
        L[x].push_back({ y, c });
        L[y].push_back({ x, c });
    }
}

void Solve()
{
    s.insert({ 0, start });
    for (int i = 1; i <= n; i++)
        dist[i] = 2e9;
    dist[start] = 0;
    while (!s.empty())
    {
        int vertex = s.begin() -> second;
        int d = s.begin()->first;
        s.erase(s.begin());
        for (auto it : L[vertex])
        {
            if (dist[it.first] > d + it.second)
            {
                if (dist[it.first] != 2e9)
                    s.erase(s.find({ dist[it.first], it.first }));
                dist[it.first] = d + it.second;
                s.insert({ dist[it.first], it.first });
            }
        }
    }
    for (int i = 1; i <= n; i++)
        if (dist[i] != ans[i])
        {
            fout << "NU\n";
            return;
        }
    fout << "DA\n";
}

int main()
{
    int T;
    fin >> T;
    while (T--)
    {
        Read();
        Solve();
    }
    fin.close();
    fout.close();
}