Cod sursa(job #2758386)

Utilizator lahayonTester lahayon Data 10 iunie 2021 01:22:54
Problema Distante Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <fstream>
#include <vector>

using namespace std;

bool solve(const vector<int>& distances, const vector<vector<pair<int,int>>>& graph, int node_start){

    if(distances[node_start] != 0)
        return false;
    for(int i = 0; i < graph.size(); ++i){
        if(i != node_start){
            bool valid_distance = false;
            for(int j = 0; j < graph[i].size(); ++j){
                if(distances[graph[i][j].first] + graph[i][j].second < distances[i])
                    return false;
                if(distances[graph[i][j].first] + graph[i][j].second == distances[i])
                    valid_distance = true;
            }
            if(!valid_distance)
                return false;
        }
    }
    return true;
}


int main()
{
    ifstream cin("distante.in");
    ofstream cout("distante.out");
         
    int T, N, M, S;
    cin >> T;
    for(; T > 0; --T){

        cin >> N >> M >> S;
        vector<int> distances(N);
        vector<vector<pair<int,int>>> graph(N);
        for(int i = 0; i < N; ++i)
            cin >> distances[i];
        int x, y, z;
        for(int i = 0; i < M; ++i){
            cin >> x >> y >> z;
            --x; --y;
            graph[x].push_back(pair<int, int>(y, z));
            graph[y].push_back(pair<int, int>(x, z));
        }
        bool valid = solve(distances, graph, --S);
        if(valid)
            cout << "DA\n";
        else
            cout << "NU\n";
    }

    cin.close();
    cout.close();

    return 0;
}