Cod sursa(job #977541)

Utilizator Adrian1997Radulescu Adrian Adrian1997 Data 26 iulie 2013 07:28:13
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <fstream>
#include <set>
#include <vector>
#define DIM 50060
#define INF 1000000000
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
int T,n,m,st,D[DIM],A[DIM];
bool viz[DIM];

vector<pair<long long,int> > L[DIM];
set<pair<long long,int> > S;

int main(void){
    register int i,j,x,y,c,ok;
    pair<long long,int> p,q;

    f>>T;
    for(;T>0;T--){
        f>>n>>m>>st;
        for(i=1;i<=n;i++)
            f>>A[i],D[i]=INF,viz[i]=false;
        D[st]=0;

        for(i=1;i<=m;i++){
            f>>x>>y>>c;
            L[x].push_back(make_pair(c,y));
            L[y].push_back(make_pair(c,x));
        }

        S.insert(make_pair(0,st));
        while(!S.empty()){
            q=*S.begin();
            S.erase(S.begin());
            if(viz[q.second])
                continue;
            for(i=0;i<L[q.second].size();i++){
                p=L[q.second][i];
                if(!viz[p.second] && D[p.second]>D[q.second]+p.first){
                    D[p.second]=D[q.second]+p.first;
                    S.insert(make_pair(D[p.second],p.second));
                }
            }
            viz[q.second]=1;
        }
        ok=1;
        for(i=1;i<=n;i++)
            if(A[i]!=D[i]){
                g<<"NU\n";
                ok=0;
                break;
            }
        if(ok)
            g<<"DA\n";
    }
    return 0;
}