Cod sursa(job #1232403)

Utilizator andreey_047Andrei Maxim andreey_047 Data 22 septembrie 2014 20:00:12
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <iostream>
#include <cstdio>
#include <vector>
#define in "distante.in","r",stdin
#define out "distante.out","w",stdout
#define nmax 50009
using namespace std;
int Q[nmax],sol[nmax],n,m,xi,t,s1[nmax];
vector<pair<int,int> > G[nmax];
inline void solve(){
    int i,j,k;
    k = 1;
    Q[1] = xi;
    for(i=1;i<=n;i++)
        sol[i]=-1;
     sol[xi] = 0;
   for(i=1;i<=k;i++)
    for(j=0;j<G[Q[i]].size();j++)
        if(sol[G[Q[i]][j].first] == -1  || sol[G[Q[i]][j].first] > sol[Q[i]] + G[Q[i]][j].second){
            Q[++k] = G[Q[i]][j].first;
            sol[G[Q[i]][j].first]= sol[Q[i]] + G[Q[i]][j].second;
        }
        k=0;
    for(i=1;i<=n&&!k;i++){ if(sol[i] == -1) sol[i]=0;
        if(sol[i]!=s1[i])k=1;}
    if(k) cout <<"NU\n";
    else cout <<"DA\n";
}
inline void Read(){
    int i,x,y,c;
    freopen(in);
    freopen(out);
    scanf("%d",&t);
    while(t--){
        scanf("%d%d%d",&n,&m,&xi);
        for(i=1;i<=n;i++)
            scanf("%d",&s1[i]);
      while(m--){
        scanf("%d%d%d",&x,&y,&c);
        G[x].push_back(make_pair(y,c));
        G[y].push_back(make_pair(x,c));
      }
      solve();
    }
}
int main(){
    Read();
    return 0;
}