Cod sursa(job #2335063)

Utilizator WayronUrsu Ianis-Vlad Wayron Data 3 februarie 2019 16:10:29
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <bits/stdc++.h>
using namespace std;

vector<vector<pair<int, int> > > graph;
vector<bool> checked;
vector<int> dist;



bool distTest(int node){
    if(dist.at(node)!=0) return false;

    checked.at(node) = true;

    queue<int> Queue;

    Queue.push(node);

    while(!Queue.empty()){
        int qnode = Queue.front();
        Queue.pop();

        for(auto& elem:graph.at(qnode)){
            if(checked.at(elem.first)==false){
                int nDist = dist.at(qnode) + elem.second;

                if(nDist<dist.at(elem.first)) return false;
                if(nDist==dist.at(elem.first)){
                    checked.at(elem.first) = true;
                    Queue.push(elem.first);
                }
            }
        }
    }

    for(size_t i=1; i<checked.size(); i++) if(checked.at(i)==false) return false;

    return true;
}


int main()
{
    ifstream fin("distante.in");
    ofstream fout("distante.out");
    int t;
    fin>>t;
    for(int k=1; k<=t; k++){

        int m, n, s;
        fin>>n>>m>>s;

        checked.resize(n+1, false);
        graph.resize(n+1, vector<pair<int, int> >());
        dist.resize(n+1);

        for(int i=1; i<=n; i++) fin>>dist.at(i);

        int a, b, c;
        for(int i=1; i<=m; i++){
            fin>>a>>b>>c;
            graph.at(a).push_back(make_pair(b, c));
            graph.at(b).push_back(make_pair(a,c));
        }

        if(distTest(s)) fout<<"DA\n";
        else fout<<"NU\n";

        checked.clear();
        dist.clear();
        graph.clear();
    }

}