Cod sursa(job #122842)

Utilizator gigi_becaliGigi Becali gigi_becali Data 13 ianuarie 2008 19:30:11
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <cstdio>
#include <cstdlib>
#include <string>
#define maxn 50001
#define oo 0x3f3f3f3f //infinit ... nu orice valoare functioneaza cu memset!!!
#define tata(i)  ((i)>>1) //i/2
#define left(i)  ((i)<<1) //2*i
#define right(i) (((i)<<1)|1) // 2*i+1


int d1[maxn], d[maxn];
int H[maxn], poz[maxn];
int nh; // nr de elemente din heap;
struct nod { int x, c; };

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

inline void swap(int i, int j)
{
  int t=H[i];H[i]=H[j]; H[j]=t;
  poz[H[i]]=i; poz[H[j]]=j;
}

inline void heapup(int i)
{
  if(i<=1)return;
  if(d[H[i]] < d[tata(i)] ) swap(i, tata(i)), heapup(tata(i));
}

inline void heapdown(int i)// aleg minimul dintre fii
{
  int min=i;
  if(left(i) <= nh)  if(d[H[i]] > d[H[left(i)]])  min=left(i);
  if(right(i) <= nh) if(d[H[i]] > d[H[right(i)]]) min=right(i);
  if(i!=min) swap(i, min), heapdown(min);
}


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[1]=1;
  int nr=1;//nr elemente din coada;

  while(nr)
    {
      u=Q[p];
      --nr;
      ++p;
      p&=mod;
      
      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;
	    ++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]
      // a[i][j].x=nodul, a[i][j].c=costul j=1, a[i][0].x

      while(m--)
	{
	  scanf("%d %d %d\n", &p, &q, &c);
	  
	  //printf("%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)printf("%d ", d[i]);
       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;
}