Cod sursa(job #881822)

Utilizator PetcuIoanPetcu Ioan Vlad PetcuIoan Data 18 februarie 2013 17:46:23
Problema Distante Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include<cstdio>
#include<cassert>
#include<cstring>

#include<vector>
#include<algorithm>
#include<queue>

#define pb push_back
#define mp make_pair
#define f first
#define s second

using namespace std;

int n, m, s, vals[50005], vis[50005];
vector<pair<int, int> > graph[50005];

void read(){
  memset(vals, 0, sizeof(vals));
  memset(vis, 0, sizeof(vis));

  scanf("%d%d%d", &n, &m, &s);
  for(int i = 1; i <= n; ++i)
    graph[i].clear();

  for(int i = 1; i <= n; ++i)
    scanf("%d", &vals[i]);

  for(int i = 1; i <= m; ++i){
    int x, y, c;
    scanf("%d%d%d", &x, &y, &c);
    graph[x].pb(mp(y, c));
    graph[y].pb(mp(x, c));
  }

}

int ans;

void solve(){
  ans = 1;
  queue<int> q;
  if(vals[s]){
    ans = 0;
    return ;
  }
  q.push(s);
  vis[s] = 1;
  while(!q.empty()){
    int now = q.front();
    q.pop();
    for(int i = 0; i < graph[now].size(); ++i){
      int node = graph[now][i].f;
      int edg = graph[now][i].s;
      if(vals[node] == vals[now] + edg && !vis[node]){
        vis[node] = 1;
        q.push(node);
      }
      else if(vals[node] > vals[now] && vals[now] + edg < vals[node]){
        ans = 0;
        return;
      }
    }

  }

  for(int i = 1; i <= n; ++i)
    if(!vis[i])
      ans = 0;

}

void write(){
  if(ans == 1)
    printf("DA\n");
  else
    printf("NU\n");
}

int main(){
  assert(freopen("distante.in", "r", stdin));
  assert(freopen("distante.out", "w", stdout));

  int cases;
  scanf("%d", &cases);
  for(int i = 1; i <= cases; ++i){
    read();
    solve();
    write();
  }

  return 0;
}