Cod sursa(job #2888305)

Utilizator ProBatmanBalint Leonard ProBatman Data 10 aprilie 2022 22:26:08
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.26 kb
#include <bits/stdc++.h>

using namespace std;

string fisier = "distante";

ifstream fin(fisier+".in");
ofstream fout(fisier+".out");

const int CMAX = 5e4+15;
const int oo = 2147483647;

int n , m , start , x , y , c;
int nr_graf;
int D[CMAX];
bool viz[CMAX];

vector < int > distante;
vector < pair < int , int > > graf[CMAX];

struct cmp{
    bool operator()(int x, int y){
        return D[x] > D[y];
    }
};

priority_queue < int , vector < int > , cmp > Q;

void dijkstra(vector < pair < int , int > > graf[], int start)
{
    D[start] = 0;
    viz[start] = 1;
    Q.push(start);
    while(!Q.empty()){
        int nod_curent = Q.top();
        Q.pop();
        viz[nod_curent] = 0;
        for(int i=0;i<graf[nod_curent].size();i++){
            int vecin = graf[nod_curent][i].first;
            int cost  = graf[nod_curent][i].second;
            if(D[nod_curent]+cost<D[vecin]){
                D[vecin] = D[nod_curent] + cost;
                if(viz[vecin]==0)
                {
                    viz[vecin] = 1;
                    Q.push(vecin);
                }
            }
        }
    }
}

bool comparare(int D[], vector < int > distante){
    for(int i=1;i<=n;i++)
        if(D[i]!=distante[i-1])
            return false;
    return true;
}

int main()
{
    fin >> nr_graf;
    for(int temp=1;temp<=nr_graf;temp++){
        fin >> n >> m >> start;
        for(int j=1;j<=n;j++){
            int nr;
            fin >> nr;
            distante.push_back(nr);
            D[j] = oo;
            viz[j] = 0;
            graf[j].clear();
        }
        for(int j=1;j<=m;j++)
        {
            fin >> x >> y >> c;
            graf[x].push_back({y,c});
            graf[y].push_back({x,c});
        }

        dijkstra(graf,start);

        /*
        cout << "vectorul de distante dijkstra: " << '\n';
        for(int j=1;j<=n;j++)
            cout << D[j] << " ";
        cout << '\n';
        cout << "vectorul de distante citit" << '\n';
        for(int j=1;j<=n;j++)
            cout << distante[j] << " ";
        cout << '\n';
        */

        if(comparare(D,distante)==false)
            fout << "NU" << '\n';
        else
            fout << "DA" << '\n';

    }
    return 0;
}