Cod sursa(job #921512)

Utilizator brainwashed20Alexandru Gherghe brainwashed20 Data 21 martie 2013 01:36:35
Problema Distante Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include<fstream>
#include<vector>
#include<algorithm>
#include<queue>
#include<bitset>

#define Nmax 50001
#define mp make_pair

using namespace std;

ifstream f("distante.in");
ofstream g("distante.out");

int Dinit[Nmax], D[Nmax], N, M, S, L;
priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > PQ;
vector<pair<int, int> > G[Nmax];
bitset<Nmax> viz;

void dijkstra() {

    int val, x, cost, nod;
    vector<pair<int, int> > :: iterator it, itend;

    fill(D+1, D+N+1, 1<<30);
    viz.reset();
    D[S] = 0;
    PQ.push(mp(0, S));

    while(!PQ.empty()) {
        x = PQ.top().second;
        if(viz[x]) {
            PQ.pop();
            continue;
        }
        D[x] = PQ.top().first;
        viz[x] = 1;
        PQ.pop();
        for(it=G[x].begin(), itend=G[x].end(); it!=itend; ++it) {
            nod = it->first;
            cost = it->second;
            if(D[nod] > D[x] + cost) {
                D[nod] = D[x] + cost;
                PQ.push(mp(D[nod], nod));
            }
        }
    }
}

int verif() {

    for(int i=1; i<=N; i++)
        if(D[i] != Dinit[i])
            return 0;
    return 1;
}

int main() {

    int T, i, j, c;

    f>>T;
    while(T--) {
        f>>N>>M>>S;
        for(i=1; i<=N; i++)  {
            f>>Dinit[i];
            G[i].clear();
        }
        while(M--) {
            f>>i>>j>>c;
            G[i].push_back(make_pair(j,c));
            G[j].push_back(make_pair(i,c));
        }
        dijkstra();
        if(verif() == 1)
            g<<"DA\n";
        else
            g<<"NU\n";
    }

    f.close();
    g.close();

    return 0;
}