Cod sursa(job #2167791)

Utilizator CezarTDTodirisca Cezar CezarTD Data 13 martie 2018 23:36:20
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <bits/stdc++.h>

using namespace std;

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

const int N=1e5+5;
const int INF=1<<30;

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

bool vizitat[N];

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(int i=1; i<=nrMuchii; i++)
    {
        fin>>origine>>destinatie>>lung;
        muchii[origine].push_back(make_pair(destinatie,lung));
        muchii[destinatie].push_back(make_pair(origine,lung));
    }

}

void Determinare()
{
    for(int i=1; i<=nrNoduri; i++)
        EndDist[i]=INF;
    EndDist[Start]=0;
    Coada.push({0,Start});
    int CostCurent,NodCurent;
    while(Coada.size())
    {
        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++)
    {
        //cout<<EndDist[i]<<' ';
        if(PreDist[i]!=EndDist[i])
            ok=false;
    }
    //cout<<'\n';
    if(ok)
        fout<<"DA\n";
    else
        fout<<"NU\n";
}

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

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