Pagini recente » Cod sursa (job #226027) | Rating Stefan Nicoleta Florina (nicoleta_stefan) | Cod sursa (job #135750) | Cod sursa (job #2431454) | Cod sursa (job #1321938)
#include<fstream>
#include<string.h>
using namespace std;
int i,T,n,m,s,D[50001],V[50001],U[50001],inf=500000;
struct lista {int nod,cost;
lista *leg;
}*G[50001];
void adaug(int i,int j,int c)
{
lista *p;
p=new lista;
p->nod=j;
p->cost=c;
p->leg=G[i];
G[i]=p;
}
void citire()
{
scanf("%d %d %d", &n,&m,&s);
int i,j,c;
for(i=1;i<=n;++i) scanf("%d", &V[i]);
while(m--)
{
scanf("%d %d %d", &i,&j,&c);
adaug(i,j,c);
}
}
void Dantzig(int start)
{
int nod,mini,i;
for(i=1;i<=n;++i) D[i]=inf;
memset(U,0,sizeof U);
D[start]=0;
while(1)
{
mini=inf;
for(i=1;i<=n;++i)
if(!U[i]&&mini>D[i]) mini=D[i],nod=i;
if(mini==inf) break;
// printf("%d \n", nod);
U[nod]=1;
lista *p;
for(p=G[nod];p;p=p->leg)
{
//printf("%d %d \n", p->nod,p->cost);
if(D[p->nod]>D[nod]+p->cost)
{
D[p->nod]=D[nod]+p->cost;
}
}
}
int ok=1;
/* for(i=1;i<=n;++i) printf("%d ", D[i]);
printf("\n");*/
for(i=1;i<=n&&ok;++i) if(V[i]!=D[i]) ok=0;
if(ok) printf("DA \n");
else printf("NU \n");
}
int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%d", &T);
for(i=1;i<=T;++i)
{
citire();
Dantzig(s);
}
return 0;
}