Cod sursa(job #294164)

Utilizator socheoSorodoc Ionut socheo Data 2 aprilie 2009 12:53:02
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include<stdio.h>
#include<queue>
#define INF 1000000
using namespace std;
struct nod{
	int nd;
	int cost;
	nod *next;
};
nod *l[50001];
int n,m,s,d[50001],t,tar[50001];
nod *ix;
queue<int> q;
bool inq[50001];
void add(int x,int y ,int z)
{  nod *p=new nod;
  p->nd=y;
  p->cost=z;
  p->next=l[x];
  l[x]=p;
  nod *w=new nod;
  w->nd=x;
  w->cost=z;
  w->next=l[y];
  l[y]=w;
}
void  initial(int e)
{ for(int i=1;i<=n;i++)
     { d[i]=INF; 
       inq[i]=0;
	 }
    d[e]=0;
}
void relaxare(int u,int p,int w)
{ if(d[p]>d[u]+w)
   { d[p]=d[u]+w;
     if(inq[p]==0) 
		 { q.push(p);
			 inq[p]=1;
		 }
   }
	
}
void bford(int nod)
{ initial(nod);
    q.push(nod);
	inq[nod]=1;
	while(!q.empty())
	{ int a=q.front();
	  q.pop();
	  inq[a]=-1;
	  for(ix=l[a];ix;ix=ix->next)
	   { relaxare(a,ix->nd,ix->cost);
	   }
	}
	
}
int ver()
{ for(int k=1;k<=n;k++)
	if(tar[k]!=d[k])
		return 0;
	return 1;
}
int main()
{  freopen("distante.in","r",stdin);
   freopen("distante.out","w",stdout);
   scanf("%d",&t);
   while(t)
   { scanf("%d%d%d",&n,&m,&s);
     for(int i=1;i<=n;i++)
		 scanf("%d",&tar[i]);
	 int x,y,z;
	 for(int i=1;i<=m;i++)
	   { scanf("%d%d%d",&x,&y,&z);
	     add(x,y,z);
	   }
	bford(s);
	if(ver()==0)
		printf("NU\n");
	else printf("DA\n");
	t--;
   }	
	
	return 0;
}