Cod sursa(job #2884503)

Utilizator raul41917raul rotar raul41917 Data 3 aprilie 2022 20:46:03
Problema Distante Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#define INF 2147483647
using namespace std;
ifstream fi("distante.in");
ofstream fo("distante.out");
int T;
vector <int>BRZ;
vector <pair<int,int> >V[50001];
set <pair<int,int> >S;
int D[50001];

void Dijkstra()
{
    while(!S.empty())
    {
        int vertex=S.begin()->second;
        S.erase(S.begin());
        for(int i=0;i<V[vertex].size();i++)
        {
            int vecin=V[vertex][i].first;
            if(D[vecin]>D[vertex]+V[vertex][i].second)
            {
                if(D[vecin]!=INF)
                    S.erase(S.find(make_pair(D[vecin],vecin)));
                D[vecin]=D[vertex]+V[vertex][i].second;
                S.insert(make_pair(D[vecin],vecin));
            }
        }
    }
}
int main()
{
    fi>>T;
    for(int test=1;test<=T;test++)
    {
        int n,m,source;
        fi>>n>>m>>source;
        BRZ.clear();
        for(int i=1;i<=n;i++)
        {
            D[i]=INF;
            V[i].clear();
            int x;
            fi>>x;
            BRZ.push_back(x);
        }
        for(int i=1;i<=m;i++)
        {
            int nodeX,nodeY,C;
            fi>>nodeX>>nodeY>>C;
            V[nodeX].push_back(make_pair(nodeY,C));
            V[nodeY].push_back(make_pair(nodeX,C));
        }
        D[source]=0;
        S.insert(make_pair(0,source));
        Dijkstra();
        int GG=0;
        for(int i=1;i<=n && GG==0;i++)
        {
            if(D[i]!=BRZ[i-1])
            {
                GG=1;
                continue;
            }
        }
        if(!GG)
            fo<<"DA"<<"\n";
        else
            fo<<"NU"<<"\n";
    }
    return 0;
}