Cod sursa(job #1027854)

Utilizator mihaiSimuSimu Mihai mihaiSimu Data 13 noiembrie 2013 10:17:36
Problema Distante Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <iostream>
#include <vector>
#include <queue>
#define INF 500000000
#define MAXN 50005
using namespace std;

int main(){
    int n,m,t,s,x,y,c;
    vector< pair<int,int> > G[MAXN];
    vector<int> dTest;
    vector<int> dist;
    
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    
    cin>>t;
    while(t--){
        cin>>n>>m>>s;
        dTest.resize(n+1);
        dist.resize(n+1);
        for(int i=1;i<=n;i++) {
            cin>>dTest[i];
            dist[i] = INF;
            G[i].clear();
        }
        for(int i=0;i<m;i++) {
            cin>>x>>y>>c;
            G[x].push_back(pair<int,int>(y,c));
            G[y].push_back(pair<int,int>(x,c));
        }
        
        dist[s] = 0;
        priority_queue< pair<int,int>, vector< pair<int,int> >, greater< pair<int,int> > > pq;
        pq.push(pair<int,int>(0,s));
        while(!pq.empty()) {
            pair<int,int> pu = pq.top();pq.pop();
            int u = pu.second;int d = pu.first;
            if(dist[u] !=d) continue;
            for(int i=0;i<G[u].size();i++) {
                pair<int,int> pv = G[u][i]; int dv = pv.second;int v = pv.first;
                if(dist[v] > dist[u] + dv) {
                    dist[v] = dist[u] + dv;
                    pq.push(pair< int,int >(dist[v],v));
                }
            }
        }
        
        bool ok = true;
        for(int i=1;i<=n;i++) {
            if(dTest[i]!=dist[i])
                ok = false;
        }
        if(ok) cout<<"DA\n";
        else cout<<"NU\n";
    }
    
    return 0;
}