Cod sursa(job #2990573)

Utilizator AndreiStreheStreche Andrei Claudiu AndreiStrehe Data 8 martie 2023 10:10:34
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

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

#define nmax 50001
#define infinite 100000000
int d[nmax],d1[nmax];
bool viz[nmax];
int nodcurent,vecin,cost,i,j,n,m,s,ok,k,k1,k2,k3,u;

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

vector <pair <int, int>> a[nmax];
priority_queue < int, vector <int>, ord > coada;

void drum(int s)
{
    while(coada.empty()==0)
    {
        nodcurent=coada.top();
        viz[nodcurent]=0; coada.pop();
        for(unsigned int i=0;i<a[nodcurent].size();i++)
        {
            vecin=a[nodcurent][i].first;
            cost=a[nodcurent][i].second;
            if(d[nodcurent]+cost<d[vecin])
            {
                d[vecin]=d[nodcurent]+cost;
                if(viz[vecin]==0)
                {
                    viz[vecin]=1;
                    coada.push(vecin);
                }
            }
        }

    }
    ok=1;
    for(i=1;i<=n;i++)
    {
        if(d[i]!=d1[i])
            ok=0;
    }
    if(ok==1)
        g<<"DA"<<'\n';
    else g<<"NU"<<'\n';

}

int main()
{
    f>>k;
    for(u=1;u<=k;u++)
    {
        f>>n>>m>>s;
        for(i=1;i<=n;i++)
            f>>d1[i];
        for(i=1;i<=m;i++)
        {
            f>>k1>>k2>>k3;
            a[k1].push_back(make_pair (k2,k3));
        }
        for(i=1;i<=n;i++)
        {
            viz[i]=0;
            d[i]=infinite;
        }
        viz[s]=1; d[s]=0;
        coada.push(s);
        drum(s);
    }


    return 0;
}