Cod sursa(job #1065614)

Utilizator Athena99Anghel Anca Athena99 Data 23 decembrie 2013 15:14:23
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <fstream>
#include <queue>
#include <vector>

using namespace std;

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

const int inf= 1<<30;
const int nmax= 50000;

int d[nmax+1], gd[nmax+1];
bool u[nmax+1];

struct str {
    int x, y;
};
vector <str> v[nmax+1];

struct str_cmp {
    bool operator() ( const str &x, const str &y ) {
        return x.y>y.y;
    }
};

priority_queue <str, vector <str>, str_cmp> q;

inline str mp( int x, int y ) {
    str sol;
    sol.x= x;
    sol.y= y;
    return sol;
}

void dijkstra( int s ) {
    q.push( mp(s, 0) );
    while ( !q.empty() ) {
        str x= q.top();
        q.pop();
        u[x.x]= 0;
        for ( int i= 0; i<(int)v[x.x].size(); ++i ) {
            if ( d[x.x]+v[x.x][i].y<d[v[x.x][i].x] ) {
                d[v[x.x][i].x]= d[x.x]+v[x.x][i].y;
                if ( u[v[x.x][i].x]==0 ) {
                    u[v[x.x][i].x]= 1;
                    q.push( mp(v[x.x][i].x, d[v[x.x][i].x]) );
                }
            }
        }
    }
}

int main(  ) {
    int t;
    fin>>t;
    for ( ; t>0; --t ) {
        int n, m, s;
        fin>>n>>m>>s;

        for ( int i= 1; i<=n; ++i ) {
            fin>>gd[i];
            d[i]= inf;
        }
        d[s]= 0;

        for ( ; m>0; --m ) {
            int a, b, c;
            fin>>a>>b>>c;
            v[a].push_back( mp(b, c) );
            v[b].push_back( mp(a, c) );
        }

        dijkstra(s);

        int x= 1;
        for ( int i= 1; i<=n; ++i ) {
            if ( d[i]!=gd[i] ) {
                x= 0;
                break;
            }
        }
    
        if ( x==1 ) {
            fout<<"DA\n";
        } else {
            fout<<"NU\n";
        }
    }

    return 0;
}