Pagini recente » Cod sursa (job #2591838) | Cod sursa (job #359558) | Cod sursa (job #942625) | Cod sursa (job #1180397) | Cod sursa (job #357871)
Cod sursa(job #357871)
#include <cstdio>
#include <vector>
#define DIM 50002
#define INFI 0x3f3f3f3f
#define DIM2 8192
#define CoadaMax 1<<20
using namespace std;
vector <int> G[DIM], Cost[DIM];
int n, i, c[CoadaMax], visited[DIM], v[DIM], sursa;
char vec[DIM2];
int poz;
void citeste(int &x)
{
x=0;
while(vec[poz]<'0' || vec[poz]>'9')
if(++poz==DIM2) fread(vec,1,DIM2,stdin),poz=0;
while(vec[poz]>='0' && vec[poz]<='9')
{
x=x*10+vec[poz]-'0';
if(++poz==DIM2) fread(vec, 1, DIM2, stdin),poz=0;
}
}
void solve(int k) {
int x, p, u;
bool fellow[DIM];
for (i=1; i<=n; i++) visited[i]=INFI;
memset (fellow, false, sizeof(fellow));
p = u = 0;
c[u] = k;
visited[k] = 0;
while ( p <= u ) {
x = c[ p++ ];
fellow[x] = false;
for (i = 0; i < G[x].size(); ++i) {
if (Cost[x][i] + visited[x] < visited [ G[x][i] ]) {
visited[ G[x][i] ] = Cost[x][i] + visited[x];
if ( fellow[G[x][i]]==false ) {
c[ ++u ] = G[x][i];
fellow[ G[x][i] ] = true;
}
}
}
}
}
int test()
{
for (i=1; i<=n; i++) {
if (visited[i]==INFI) { if (v[i]) return 0; }
else if (visited[i] != v[i] ) return 0;
}
return 1;
}
void read() {
int x, y, c, m, T;
citeste(T);
while ( T-- ) {
memset( G, 0, sizeof(G) );
memset( Cost, 0, sizeof(Cost) );
citeste (n);
citeste (m);
citeste(sursa);
for (i=1; i<=n; i++) citeste( v[i] );
for ( ; m-- ; ) {
citeste (x); citeste (y); citeste (c);
G[x].push_back(y);
G[y].push_back(x);
Cost[x].push_back(c);
Cost[y].push_back(c);
}
solve(sursa);
if (test()) printf ("DA\n");
else printf("NU\n");
}
}
int main()
{
freopen ("distante.in","r",stdin);
freopen ("distante.out","w",stdout);
read();
return 0;
}