Cod sursa(job #1913864)

Utilizator Account451Gigel Gogu Account451 Data 8 martie 2017 14:29:02
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <stdio.h>
#include <fstream>
#include <vector>
#include <iostream>
#include <queue>
#include <limits.h>
using namespace std;

#define INF INT_MAX
typedef pair<int,int> PII;


int main(void) {

    int T = 0;
    ifstream fin("distante.in");
    ofstream fout("distante.out");
    fin>>T;
    for (int i = 0; i < T; i++) {
        int N,M,s;
        fin>>N>>M>>s;
        vector< vector<PII> > edges(N);

        int dmin[N];
        for (int j = 0; j < N; ++j)
            fin>>dmin[j];

        for (int j = 0; j < M; j++) {
            int node1, node2, cost;
            fin>>node1>>node2>>cost;
            node1--,node2--;
            edges[node1].push_back(make_pair(cost,node2));
            edges[node2].push_back(make_pair(cost,node1));
        }
        s--;
        vector<int> dist(N,INF);
        vector<int> viz(N,0);
        dist[s] = 0;
        priority_queue<PII, vector<PII>, greater<PII> > Q;

        Q.push(make_pair(0,s));
        int k = 0;
        while(!Q.empty() && k<=N) {
            PII p = Q.top();
            Q.pop();
            int node = p.second;
            if(viz[node] != 0) continue;
            viz[node] = 1;


            for (vector<PII>::iterator it = edges[node].begin(); it != edges[node].end(); it++) {
                if(dist[it->second] > dist[node] + it->first)
                {
                    dist[it->second] = dist[node] + it->first;
                    Q.push(make_pair(dist[it->second], it->second));
                }
            }
            k++;
        }
        int ok = 0;

        for(int j = 0;j<N;j++){
            if(dist[j] != dmin[j]){
                ok = 1;break;
            }
        }

        if(ok == 1)
            cout<<"NU\n";
        else
            cout<<"DA\n";

    }
    return 0;
}