Cod sursa(job #3120980)

Utilizator unomMirel Costel unom Data 10 aprilie 2023 00:14:58
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <fstream>
#include <vector>
#include <set>

using namespace std;

ifstream f("distante.in");
ofstream g("distante.out");

struct nod
{
    vector <pair<int, int>> vec;
};
nod v[50005];
int di[50005];
int df[50005];
int n, m, sur, t;
multiset <pair<int, int>> s;

int main()
{

    int INF = (1 << 30) - 1;

    f>>t;
    while(t--)
    {
        f>>n>>m>>sur;
        for(int i = 1; i<=n; i++)
        {
            f>>di[i];
            v[i].vec.clear();
        }
        int st, dr, c;
        for(int i = 1; i<=m; i++)
        {
            f>>st>>dr>>c;
            v[st].vec.push_back({dr, c});
            v[dr].vec.push_back({st, c});
        }

        for(int i = 1; i<=n; i++)
        {
            if(i == sur)
            {
                df[i] = 0;
            }
            else
            {
                df[i] = INF;
            }
        }

        s.insert({0, sur});

        int nd, to, cost;
        while(!s.empty())
        {
            nd = (*s.begin()).second;
            s.erase(s.begin());

            for(int i = 0; i<v[nd].vec.size(); i++)
            {
                to = v[nd].vec[i].first;
                cost = v[nd].vec[i].second;

                if(df[to] > df[nd] + cost)
                {
                    if(df[to] != INF)
                    {
                        s.erase(s.find({df[to], to}));
                    }
                    df[to] = df[nd] + cost;
                    s.insert({df[to], to});
                }
            }
        }

        int ok = 1;
        for(int i = 1; i<=n; i++)
        {
            if(di[i] != df[i])
            {
                ok = 0;
                break;
            }
        }

        if(ok == 1)
        {
            g<<"DA \n";
        }
        else
        {
            g<<"NU \n";
        }

    }
    return 0;
}