Cod sursa(job #921510)

Utilizator brainwashed20Alexandru Gherghe brainwashed20 Data 21 martie 2013 01:27:29
Problema Distante Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include<fstream>
#include<vector>
#include<algorithm>
#include<set>

#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;
set<pair<int, int> > T;
vector<pair<int, int> > G[Nmax];

void dijkstra() {

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

    fill(D+1, D+N+1, 1<<30);
    D[S] = 0;
    T.insert(mp(0, S));

    while(!T.empty()) {
        it2 = T.begin();
        val = it2->first;
        x = it2->second;
        for(it=G[x].begin(), itend=G[x].end(); it!=itend; ++it) {
            nod = it->first;
            cost = it->second;
            if(D[nod] > val + cost) {
                if(D[nod] != 1<<30)
                    T.erase(mp(D[nod], nod));
                D[nod] = val + cost;
                T.insert(mp(D[nod], nod));
            }
        }
        T.erase(it2);
    }
}

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;
}