Cod sursa(job #2908156)

Utilizator Costin_PintilieHoratiu-Costin-Petru Pintilie Costin_Pintilie Data 1 iunie 2022 19:09:40
Problema Distante Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.77 kb
#include <bits/stdc++.h>
using namespace std;
#define MAX_COST 1000000

class minHeapComp{
public:
    bool operator()(pair<int, int> n1, pair<int, int> n2){
        return n1.second > n2.second;
    }
};


vector<int> Djikstra(int node_nbr, int src_node, vector< vector< pair<int,int> > > adj){

    priority_queue<pair<int,int>, vector<pair<int,int>>,minHeapComp > heap;
    vector<int> my_dist(node_nbr + 1, MAX_COST);

    heap.push({src_node,0});
    my_dist[src_node] = 0;

    while(!heap.empty()){
        pair<int, int> curr_node = heap.top();
        heap.pop();

        for(auto next_node : adj[curr_node.first]){
            if(my_dist[curr_node.first] + next_node.second < my_dist[next_node.first] ){
                my_dist[next_node.first] = my_dist[curr_node.first] + next_node.second;
                heap.push({next_node.first, my_dist[next_node.first]});
            }
        }

    }

    return my_dist;

}

int main()
{
    ifstream fin("distante.in");
    ofstream fout("distante.out");
    int graphs_nbr, node_nbr, edge_nbr, src_node, dist, src, dest, cost;
    fin>>graphs_nbr; //T

    for (int i = 0; i < graphs_nbr; i++){

        fin>>node_nbr>>edge_nbr>>src_node; //N,M,S

        vector<int> distances(node_nbr + 1,MAX_COST);
        vector<vector<pair<int, int>>> adj(node_nbr + 1);

        for(int j = 1; j <= node_nbr; j++){

            fin>>dist;
            distances[j] = dist;
        }


        for(int j = 0; j < edge_nbr; j++){
            fin>>src>>dest>>cost;
            adj[src].push_back({dest,cost});
            adj[dest].push_back({src,cost});
        }

        vector<int> my_dist = Djikstra(node_nbr, src_node, adj);

        bool ok = 1;
        for(int j = 1; j <= node_nbr; j++){
            if(my_dist[j] != distances[j]){
                ok = 0;
                break;
            }
        }
        if(ok)
            fout<<"DA\n";
        else
            fout<<"NU\n";

    }

    fin.close();
    fout.close();

    return 0;
}
//        cout<<"info graf:\n"<<node_nbr<<" "<<edge_nbr<<" "<<src_node<<'\n';

//        cout<<"muchii:\n";
//        for(auto it: adj){
//            for(auto e: it){
//                cout<<e.src<<' '<<e.dest<<' '<<e.cost<<'\n';
//            }
//        }
//
//        cout<<"distante date:\n";
//        for(auto it: distances){
//            cout<<it<<' ';
//        }
//        cout<<'\n';
//
//        cout<<"distante calculate:\n";
//        for(auto it: my_dist){
//            cout<<it<<' ';
//        }
//        cout<<'\n';
//        cout<<'\n';


//        if(equal(distances.begin(),distances.end(),my_dist.begin())){
//            fout<<"DA\n";
//
//        }else{
//
//            fout<<"NU\n";
//        }