Cod sursa(job #2824821)

Utilizator monicaandreea46Girbea Monica monicaandreea46 Data 3 ianuarie 2022 15:56:49
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <bits/stdc++.h>
#include<fstream>
#include<vector>
#include<map>
#include<queue>
std::ifstream f("distante.in");
std::ofstream g("distante.out");
int t, n, m, s, c, x, y, rez, suma_maxim = -1001;
std::vector<std::vector< std::pair<int, int>> > lista_cost;
std::vector<int> bronzarel;

void dijkstra(int nod){
    std::vector<int> tata;
    std::vector<int> dist;
    std::vector<bool> viz;

    for( int i=0 ; i<n ; i++)
    {
        dist.push_back(INT_MAX);
        viz.push_back(false);
        tata.push_back(-1);
    }

    dist[nod] = 0;

    std::set<std::pair<int, int>> s;

    s.insert( std::make_pair(0, nod));

    while(!s.empty()){
        int nod = s.begin()->second;

        s.erase(s.begin());

        for(auto i = lista_cost[nod].begin() ; i != lista_cost[nod].end(); i++){
            int vecin = i->first;
            int cost = i->second;

            if(dist[vecin] > dist[nod] + cost){
                s.erase(std::make_pair(dist[vecin], vecin));
                dist[vecin] = cost + dist[nod];
                tata[vecin] = nod;
                s.insert(std::make_pair(dist[vecin], vecin));
            }
        }

    }

    int ok = 1;
    for(int i = 0; i<n ; i++)
        if(dist[i] != bronzarel[i]){
            ok = 0;
            break;
        }

    if(ok == 0 ) g<<"NU";
    else g<<"DA";
    g<<"\n";

}

int main() {
    f>>t;

    while(t--){

        f>>n>>m>>s;

        std::vector< std::pair<int, int>> p;

        for(auto i = 0; i<n ; i++){
            lista_cost.push_back(p);
            bronzarel.push_back(-1);
        }

        for(int i = 0 ; i < n ; i++){
            f >> x;
            bronzarel[i] = x;
        }

        for(int i = 0 ; i < m ; i++) {
            f >> x >> y >> c;
            if(x != y){
                lista_cost[x - 1].push_back(std::make_pair(y - 1, c));
                lista_cost[y - 1].push_back(std::make_pair(x - 1, c));
            }
        }

        dijkstra(s-1);

    }

    return 0;
}