Cod sursa(job #301979)

Utilizator alecmanAchim Ioan Alexandru alecman Data 8 aprilie 2009 16:18:02
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include<stdio.h>

#define INPUT "distante.in"
#define OUTPUT "distante.out"
#define NMAX 50001

FILE *fin = fopen(INPUT, "r"), *fout = fopen(OUTPUT, "w");

struct Graph
{
  long Node;
  long Cost;
  Graph *Next;
};

int T;
long N, M, S;
long Roads[ NMAX ];
Graph *List[ NMAX ];

void readData()
{
  long Node1, Node2, CostN;
  Graph *adr;

  for(long i = 1; i <= NMAX; ++i)
    List[ i ] = NULL;

  fscanf(fin, "%ld %ld %ld", &N, &M, &S);

  for(long i = 1; i <= N; ++i)
    fscanf(fin, "%ld", Roads+i);

  for(long i = 1; i <= N; ++i)
  {
    fscanf(fin, "%ld %ld %ld", &Node1, &Node2, &CostN);

    adr = new Graph;
    adr -> Node = Node2;
    adr -> Cost = CostN;
    adr -> Next = List[ Node1 ];
    List[ Node1 ] = adr;

    adr = new Graph;
    adr -> Node = Node1;
    adr -> Cost = CostN;
    adr -> Next = List[ Node2 ];
    List[ Node2 ] = adr;
  }
}

void solve()
{
  Graph *adr;
  int OK = 1;

  for(long i = 1; i <= N && OK; ++i)
  {
    if(i != S){
      adr = List[ i ];

      OK = 0;

      while(adr != NULL)
      {
	if(Roads[ adr -> Node ] + adr -> Cost == Roads[ i ])
	{
	  OK = 1;
	  break;
	}

	adr = adr -> Next;
      }
    }
    else
      if(Roads[ i ] != 0) OK = 0;
  }
  
  if(OK)
    fprintf(fout, "DA\n");
  else
    fprintf(fout, "NU\n");
}

int main()
{
  fscanf(fin, "%d", &T);

  for(int i = 0; i < T; ++i)
  {
    readData();
    
    solve();
  }

  fclose(fin);
  fclose(fout);

  return 0;
}