Cod sursa(job #1833078)

Utilizator jurjstyleJurj Andrei jurjstyle Data 21 decembrie 2016 16:49:23
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <fstream>
#include <vector>
#include <queue>
#include <iostream>

using namespace std;

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

const int inf = 1e9;

int T, N, M, S;

vector <int> Sol, Dist;
vector <vector <pair<int,int> > > G;
priority_queue < pair<int,int> , vector <pair<int,int> > , greater<pair<int,int> > > Q;

void Dijkstra(int , vector<int> &);

int main()
{
    f >> T;
    for ( ; T ; --T)
    {
        f >> N >> M >> S;
        Sol = vector <int> (N + 1);
        for (int i = 1; i <= N; ++i)
            f >> Sol[i];
        G = vector<vector<pair<int,int> > >(N + 1);
        for (int i = 1; i <= M; ++i)
        {
            int x, y, c;
            f >> x >> y >> c;
            G[x].push_back({c,y});
            G[y].push_back({c,x});
        }
        Dijkstra(S,Dist);
        int ok = 1;
        for (int i = 1; i <= N && ok ; ++i)
            if ( Sol[i] != Dist[i] )
                 ok = false;
        if ( ok )
            g << "DA\n";
        else
            g << "NU\n";
    }
    f.close();
    g.close();
    return 0;
}

void Dijkstra (int start , vector <int> & Dist )
{
    Dist = vector<int> (N + 1, inf);
    Dist[start] = 0;
    Q.push({0,start});
    for ( ; !Q.empty() ; )
    {
        int x = Q.top().second , dx = Q.top().first;
        Q.pop() ;
        if ( dx > Dist[x] )
            continue;
        for ( const pair<int,int> & p : G[x] )
        {
            int y = p.second , w = p.first;
            if ( Dist[y] > Dist[x] + w )
            {
                Dist[y] = Dist[x] + w;
                Q.push({Dist[y],y});
            }
        }
    }
}