Pagini recente » Cod sursa (job #4533) | Cod sursa (job #721341) | Cod sursa (job #3253749) | Borderou de evaluare (job #2116732) | Cod sursa (job #122848)
Cod sursa(job #122848)
#include <cstdio>
#include <cstdlib>
#include <string>
#define maxn 50001
#define oo 0x3f3f3f3f //infinit ... nu orice valoare functioneaza cu memset!!!
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[1]=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;
}