Pagini recente » Cod sursa (job #2616694) | Cod sursa (job #720884) | Cod sursa (job #430623) | Cod sursa (job #865885) | Cod sursa (job #81920)
Cod sursa(job #81920)
#include <stdio.h>
#include <memory.h>
#include <vector>
using namespace std;
#define NMAX 50002
#define INFI 0x3f3f3f3f
#define DIM 1000000
char buf[DIM];
int poz;
#define cin(x) \
{ \
x = 0; \
while(buf[poz] < '0' || buf[poz] > '9') \
if(++poz == DIM) \
fread(buf, 1, DIM, stdin), poz = 0; \
while(buf[poz] >= '0' && buf[poz] <= '9') \
{ \
x = x*10 + (buf[poz]-'0'); \
if(++poz == DIM) \
fread(buf, 1, DIM, stdin), poz = 0; \
} \
} \
int t, n, m, s;
int d[NMAX];
vector<int> a[NMAX], c[NMAX];
void read()
{
int i;
int x, y, z;
cin(n);
cin(m);
cin(s);
// printf("%d %d %d\n", n, m, s);
for(i = 1; i <= n; ++i)
{
cin(d[i]);
a[i].clear(), c[i].clear();
}
for(i = 1; i <= m; ++i)
{
cin(x); cin(y); cin(z);
a[x].push_back(y);
c[x].push_back(z);
a[y].push_back(x);
c[y].push_back(z);
}
}
void solve()
{
int q[NMAX], dist[NMAX];
short uz[NMAX];
int inc, sf, x;
vector<int> :: iterator itx, itc, fin;
memset(uz, 0, sizeof(uz));
memset(dist, INFI, sizeof(dist));
inc = sf = 1;
q[1] = s;
dist[s] = 0;
++uz[s];
while(inc <= sf)
{
x = q[inc++];
--uz[x];
for(fin = a[x].end(), itx = a[x].begin(), itc = c[x].begin(); itx != fin; ++itx, ++itc)
{
if(dist[*itx] > dist[x] + *itc)
{
dist[*itx] = dist[x] + *itc;
if(!uz[*itx])
{
++uz[*itx];
q[++sf] = *itx;
}
}
}
}
for(int i = 1; i <= n; ++i)
if(dist[i] != d[i])
{
printf("NU\n");
return ;
}
printf("DA\n");
}
int main()
{
freopen("distante.in", "r", stdin);
freopen("distante.out", "w", stdout);
fread(buf, 1, DIM, stdin);
cin(t);
while(t--)
{
//printf("%d\n", t);
read();
solve();
}
return 0;
}