Cod sursa(job #2167748)

Utilizator CezarTDTodirisca Cezar CezarTD Data 13 martie 2018 23:18:40
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <bits/stdc++.h>
#define N 50010
#define INF 1000000000
using namespace std;

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

vector<pair<int,int>>muchii[N];
priority_queue<pair<int,int>>Coada;
bitset<N>vizitat;

int Tests,nrNoduri,nrMuchii,Start;
int PreDist[N],EndDist[N];

void Citire()
{
    fin>>nrNoduri>>nrMuchii>>Start;

    for(int i=1;i<=nrNoduri;i++)
        fin>>PreDist[i];

    int origine,destinatie,lung;
    for(;nrMuchii;nrMuchii--)
        fin>>origine>>destinatie>>lung;
        muchii[origine].push_back({destinatie,lung});
        muchii[destinatie].push_back({origine,lung});

}

void Determinare()
{
    for(int i=1;i<=nrNoduri;i++)
        EndDist[i]=INF;
    EndDist[Start]=0;
    Coada.push({0,Start});
    while(Coada.size())
    {
        int CostCurent,NodCurent;
        tie(CostCurent,NodCurent)=Coada.top();
        Coada.pop();
        CostCurent *= -1;
        if(vizitat[NodCurent])
            continue;
        vizitat[NodCurent]=true;
        for(auto NodUrm:muchii[NodCurent])
        {
            if(EndDist[NodUrm.first]>CostCurent+NodUrm.second)
            {
                EndDist[NodUrm.first]=CostCurent+NodUrm.second;
                Coada.push({-EndDist[NodUrm.first],NodUrm.first});
            }
        }
    }

}

void Verificare()
{
    bool ok=true;
    for(int i=1;i<=nrNoduri;i++)
    {
        if(PreDist[i]!=EndDist[i])
            ok=false;
    }
    if(ok)
        fout<<"DA\n";
    else
        fout<<"NU\n";
}

void Resetare()
{
    for(int i=0;i<=nrNoduri;i++)
        muchii[i].clear();
    while(Coada.size())
        Coada.pop();
    vizitat.reset();
    memset(PreDist,0,N+1);
    memset(EndDist,0,N+1);
}

int main()
{
    fin>>Tests;
    for(;Tests;Tests--)
    {
        Citire();
        Determinare();
        Verificare();
        Resetare();
    }
    return 0;
}