Cod sursa(job #1389910)

Utilizator felixiPuscasu Felix felixi Data 16 martie 2015 18:48:36
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <fstream>
#include <queue>
#include <algorithm>
#include <vector>

using namespace std;

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

const int NMAX = 50000;
const int INF  = ( 1 << 30 );

struct DAP {
    int n,c;
};

struct cmp_DAP {
    bool operator() ( DAP A, DAP B ) {
        return ( A.c > B.c );
    }
};

DAP make_DAP( int nod, int cost ) {
    DAP aux;
    aux.n = nod;
    aux.c = cost;
    return aux;
}

priority_queue < DAP, vector<DAP>, cmp_DAP > Hp;
vector <DAP> G[NMAX+3];
int dj[NMAX+3], id[NMAX+3];
int T, N, M, S;

int main() {
    in >> T;
    for( int t = 0;  t < T;  ++t ) {
        while( !Hp.empty() )  Hp.pop();

        in >> N >> M >> S;
        for( int i = 1;  i <= N;  ++i ) {
            in >> id[i];
            dj[i] = INF;
        }
        for( int i = 1;  i <= M;  ++i ) {
            int x,y,c;
            in >> x >> y >> c;
            G[x].push_back( make_DAP( y,c ) );
            G[y].push_back( make_DAP( x,c ) );
        }

        dj[S] = 0;
        Hp.push( make_DAP( S, 0 ) );
        while( !Hp.empty() ) {
            DAP Start = Hp.top();
            Hp.pop();

            for( int i = 0;  i < (int)G[Start.n].size();  ++i ) {
                DAP Final = G[Start.n][i];
                if( dj[Start.n] + Final.c < dj[Final.n] ) {
                    dj[Final.n] = dj[Start.n] + Final.c;
                    Hp.push( make_DAP( Final.n, dj[Final.n] ) );
                }
            }
        }

        bool ok = 1;
        for( int i = 1;  i <= N && ok;  ++i ) {
            ok = ( ok && ( dj[i] == id[i] ) );
        }

        if( ok ) out << "DA\n";
        else out << "NU\n";
    }

    in.close();
    out.close();
    return 0;
}