Cod sursa(job #2389641)

Utilizator HiImEeveeMatei Andrei HiImEevee Data 27 martie 2019 12:34:29
Problema Distante Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>

using namespace std;

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

const int NMAX  = 50010;
const int INF = 1000000000;

int n, m, s, T;
int dist[NMAX], distB[NMAX];

vector< pair<int, int> > G[NMAX];

void Dijkstra(int s)
{
    set<pair<int, int>> Q;
    for(int i = 1; i <= n; i++)
        dist[i] = INF;
    dist[s] = 0;
    Q.insert(make_pair(0, s));
    while(!Q.empty())
    {
        int node = Q.begin()->second;
        int d = Q.begin()->first;
        Q.erase(Q.begin());
        for(auto it = G[node].begin(); it != G[node].end(); it++)
        {
            int to = it->first;
            int cost = it->second;
            if(dist[to] > dist[node] + cost)
                {
                    if(dist[to] != INF)
                        Q.erase(Q.find(make_pair(dist[to], to)));
                    dist[to] = dist[node] + cost;
                    Q.insert(make_pair(dist[to], to));
                }

        }
    }
}

int main()
{
    fin>>T;
    for(;T>=1; T--)
    {

        fin>>n>>m>>s;
        for(int i = 1; i <= n; i++)
            fin>>distB[i];
        for(int i = 1; i <= m; i++)
        {
            int to, from, cost;
            fin>>to>>from>>cost;
            G[to].push_back(make_pair(from, cost));
            G[from].push_back(make_pair(to, cost));
        }
        Dijkstra(s);
        bool ok = true;
        for(int i = 1; i <= n && ok; i++)
            if(distB[i] != dist[i])
                ok = false;
        if(ok)
            fout<<"DA\n";
        else
            fout<<"NU\n";
        for(int i = 1; i <= n; i++)
            G[i].clear();
    }
    return 0;
}