Cod sursa(job #2398758)

Utilizator StasBrega Stanislav Stas Data 6 aprilie 2019 00:47:02
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMax=50005;
const int oo=(1 << 30);

vector <pair <int,int> >v[NMax];

int T,S,N,M,disi[NMax],disf[NMax];
bool in[NMax];

struct comp
{
    bool operator()(int x, int y)
    {
        return disf[x]>disf[y];
    }
};

priority_queue <int, vector<int>, comp> coada;

void citeste()
{
    fin >> N >> M >> S;
    for(int i=1;i<=N;i++)
    {
        fin >> disi[i];
        disf[i]=oo;
        in[i]=false;
    }
    for(int i=1;i<=M;i++)
    {
        int a,b,c;
        fin >> a >> b >> c;
        v[a].push_back(make_pair(b,c));
        v[b].push_back(make_pair(a,c));
    }
}
void djk(int ni)
{
    disf[ni]=0;
    coada.push(ni);
    int nod,vecin,cost;
    while(!coada.empty())
    {
        nod=coada.top();
        coada.pop();
        in[nod]=true;
        for(int i=0;i<v[nod].size();i++)
        {
            vecin=v[nod][i].first;
            cost=v[nod][i].second;
            if(disf[nod]+cost<disf[vecin])
            {
                disf[vecin]=disf[nod]+cost;
                if(in[vecin]==false)
                {
                    in[vecin]=true;
                    coada.push(vecin);
                }
            }
        }
    }
}
int main()
{

    fin >> T;

    for(;T;T--)
    {
        citeste();
        djk(S);
        int ok=1;
        for(int i=1;i<=N;i++)
            if(disi[i]!=disf[i])
                ok=0;
        if(ok)
            fout << "DA" << endl;
        else
            fout << "NU" << endl;
    }

    return 0;

}