Cod sursa(job #2679393)

Utilizator Theo20067Cismaru Theodor-Alexe Theo20067 Data 30 noiembrie 2020 14:58:13
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <fstream>
#include <vector>
#include <set>
#define DIM 100010
#define INF DIM*1000
using namespace std;
vector<pair <int, int> > L[DIM];
set< pair<int, int> >S;
int V[DIM],D[DIM],i,x,y,c,n,N,k,m,l,sol,T,SOL[DIM];

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

int main()
{
    fin>>T;
    for(l=1;l<=T;l++)
    {
        fin>>n>>m>>N;
        for(i=1;i<=n;i++)
            fin>>SOL[i];

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

        for(i=1;i<=n;i++)
            D[i]=INF;

        D[N]=0;
        S.insert(make_pair(0,N));
        while(!S.empty())
        {
            k=S.begin()->second;
            S.erase(S.begin());
            for(i=0;i<L[k].size();i++)
                if(D[L[k][i].first]>D[k]+L[k][i].second)
                {
                    S.erase(make_pair(D[L[k][i].first],L[k][i].first));

                    D[L[k][i].first]=D[k]+L[k][i].second;

                    S.insert(make_pair(D[L[k][i].first],L[k][i].first));
                }
        }
        sol=1;
        for(i=1;i<=n;i++)
        {
            if(D[i]!=SOL[i])
            {
                sol=0;
                L[i].clear();
                break;
            }

        }
        if(sol==1)
            fout<<"DA"<<"\n";
        else
            fout<<"NU"<<"\n";
    }
}