Cod sursa(job #2456732)

Utilizator GabyD002Dobrita Gabriel GabyD002 Data 15 septembrie 2019 13:21:43
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <bits/stdc++.h>
#define NM 50005
#define oo (1<<30)
#define pii pair<int,int>
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");

int n,m,s,t,d[NM],sol[NM];
bool viz[NM];

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

vector <pii> v[NM];
priority_queue <int,vector<int>,ok> heap;

void Read();
void Solve();
void Write();
void ClearVec();
void Dijkstra();

int main()
{   Solve();
    return 0;
}

void Read()
{   f>>n>>m>>s;
    for(int i=1; i<=n; i++)
        f>>sol[i];
    for
    (   int x,y,c;
        m--;
        f>>x>>y>>c,
        v[x].push_back({y,c}),
        v[y].push_back({x,c})
    );
}

void Dijkstra()
{   for(int i=1; i<=n; i++)
        d[i]=oo;
    d[s]=0;
    heap.push(s);
    viz[s]=true;
    while(!heap.empty())
    {   int nod=heap.top();
        heap.pop();
        viz[nod]=false;
        for(int i=0; i<v[nod].size(); i++)
        {   int nodV=v[nod][i].first;
            int cost=v[nod][i].second;
            if(d[nod]+cost<d[nodV])
            {   d[nodV]=d[nod]+cost;
                if(!viz[nodV])
                {   viz[nodV]=true;
                    heap.push(nodV);
                }
            }
        }
    }
}

void Write()
{   bool ok=true;
    for(int i=1; i<=n; i++)
        d[i]!=sol[i] ? ok=false : ok=ok;
    g<<(ok ? "DA\n" : "NU\n");
}

void ClearVec()
{   for(int i=0; i<NM; i++)
        v[i].clear();
}

void Solve()
{   f>>t;
    while(t--)
    {   Read();
        Dijkstra();
        Write();
        ClearVec();
    }
}