Cod sursa(job #694357)

Utilizator rusu_raduRusu Radu rusu_radu Data 27 februarie 2012 20:10:30
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <cstdio>
#include <cassert>
#include <vector>
#include <queue>
#define Nmax 50005
#define INF (int)1e9
#define InFile "distante.in"
#define OutFile "distante.out"
#define pb push_back

using namespace std;

int n, m, S;
int R[Nmax], d[Nmax];
queue <int> Q;
vector <int> A[Nmax], C[Nmax];

void read();
void BellmanFord();
void write();
void reset();

int main()
{
  int T;
  assert (freopen (InFile, "r", stdin));
  assert (freopen (OutFile, "w", stdout));
  scanf ("%d\n", &T);
  while (T--)
  {
    read();
    BellmanFord();
    write();
    reset();
  }
  return 0;
}

void read()
{
  int i, x, y, c;
  scanf ("%d %d %d\n", &n, &m, &S);
  for (i=1; i<=n; i++) scanf ("%d ", &R[i]);
  for (i=1; i<=m; i++)
  {
    scanf ("%d %d %d\n", &x, &y, &c);
    A[x].pb(y); C[x].pb (c);
    A[y].pb(x); C[y].pb (c);
  }
}

void BellmanFord()
{
  int i, x, y, c, lg;
  int inq[Nmax];
  for (i=1; i<=n; i++) d[i]=INF;
  Q.push (S); d[S]=0; inq[S]=1;
  while (!Q.empty())
  {
    x=Q.front(); Q.pop(); inq[x]=0;
    lg=A[x].size();
    for (i=0; i<lg; i++)
    {
      y=A[x][i]; c=C[x][i];
      if (d[y]>d[x]+c)
      {
        d[y]=d[x]+c;
        if (!inq[y])
          inq[y]=1, Q.push(y);
      }
    }
  }
}

void write()
{
  int i;
  for (i=1; i<=n; i++)
    if (d[i]!=R[i]){
      printf ("NU\n");
      return;}
  printf ("DA\n");
}

void reset()
{
  int i;
  for (i=1; i<=n; i++)
  {
    A[i].resize (0);
    C[i].resize (0);
  }
}