Cod sursa(job #1715128)

Utilizator preda.andreiPreda Andrei preda.andrei Data 9 iunie 2016 23:00:55
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

#define NMAX 50000
#define INFINIT 0x3F3F3F3F

vector< pair<int, int> > ad[NMAX + 1];
vector<int> distante(NMAX + 1);
vector<int> distanteOriginale(NMAX + 1);
vector<bool> inCoada(NMAX + 1);

void aflaDistante(int nod);
bool cmp(int a, int b);
bool aceleasiValori(const vector<int> &v1, const vector<int> &v2, int n);

int main()
{
    ifstream fin("distante.in");
    ofstream fout("distante.out");

    int t;
    fin >> t;
    while(t--){
        int n, m, s;
        fin >> n >> m >> s;

        for(int i = 1; i <= n; ++i){
            fin >> distanteOriginale[i];
            distante[i] = INFINIT;
            ad[i].clear();
        }

        while(m--){
            int x, y, c;
            fin >> x >> y >> c;
            ad[x].push_back(make_pair(y, c));
            ad[y].push_back(make_pair(x, c));
        }

        aflaDistante(s);

        fout << ((aceleasiValori(distante, distanteOriginale, n)) ? "DA" : "NU") << "\n";
    }

    return 0;
}

bool aceleasiValori(const vector<int> &v1, const vector<int> &v2, int n){
    for(int i = 1; i <= n; ++i)
        if(v1[i] != v2[i])
            return false;
    return true;
}

void aflaDistante(int nod){
    priority_queue<int, vector<int>, decltype(&cmp)> q(&cmp);

    q.push(nod);
    distante[nod] = 0;

    while(!q.empty()){
        nod = q.top();
        q.pop();

        inCoada[nod] = false;

        for(auto legatura : ad[nod]){
            int vecin = legatura.first;
            int cost = legatura.second;

            if(distante[vecin] > distante[nod] + cost){
                distante[vecin] = distante[nod] + cost;
                if(!inCoada[vecin]){
                    q.push(vecin);
                    inCoada[vecin] = true;
                }
            }
        }
    }
}

bool cmp(int a, int b){
    return distante[a] > distante[b];
}