Cod sursa(job #122870)

Utilizator nuexistnuexist nuexist Data 13 ianuarie 2008 20:07:09
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <cstdio>
#include <cstdlib>
#include <string>
#define maxn 50001
#define oo 0x3f3f3f3f 

int d1[maxn], d[maxn];
struct nod { int x, c; };

nod *a[maxn];
int n;
int source;
bool use[maxn];


void bellman_ford_moore(int S)//un fel de bfs
{
  int i, u;
  memset(d, oo, sizeof(d));
  memset(use, 0, sizeof(use));
  d[S]=0;
  int Q[(1<<17)];
  const int mod=(1<<17)-1;
  int p=1, q=1;
  Q[1]=S;
  use[S]=1;
  int nr=1;//nr elemente din coada;

  while(nr)
    {
      u=Q[p];
      --nr;
      ++p;
      p&=mod;
      use[u]=0;
 
      for(i=1;i<=a[u][0].x;++i)
	if(d[u] + a[u][i].c < d[a[u][i].x])
	  {
	    d[a[u][i].x]=d[u]+a[u][i].c;
	    if(!use[a[u][i].x])
	      {
		use[a[u][i].x]=1;
		++q;
		q&=mod;
		Q[q]=a[u][i].x;
		++nr;
	      }
	  }
    }
  
}

int main()
{
  freopen("distante.in","r",stdin);
  freopen("distante.out","w",stdout);
  int m, T,i,p,q,c;
  scanf("%d\n", &T);

  while(T--)
    {
      scanf("%d %d %d\n", &n, &m, &source);
     
      for(i=1;i<=n;++i) scanf("%d ", &d1[i]);

      
      for(i=1;i<=n;++i) a[i]=(nod *)realloc(a[i], sizeof(nod)*2),
 a[i][0].x=0; //a[i][0].x=lungimea listei a[i]

      while(m--)
	{
	  scanf("%d %d %d\n", &p, &q, &c);
	  
	  a[p]=(nod*)realloc(a[p], sizeof(nod)*(a[p][0].x+2));
	  a[q]=(nod*)realloc(a[q], sizeof(nod)*(a[q][0].x+2));
	
	  nod t;
	  t.x=q;t.c=c;
	  a[p][++a[p][0].x]=t;
	  t.x=p;
	  a[q][++a[q][0].x]=t;
	
	}
      bellman_ford_moore(source);
      int ok=1;
      
      for(i=1;i<=n;++i)if(d[i]!=d1[i]) {ok=0;break;}
      if(ok)printf("DA\n");
      else printf("NU\n");
    }
  return 0;
}