Pagini recente » Cod sursa (job #716514) | Cod sursa (job #335897) | Cod sursa (job #1073161) | Cod sursa (job #2924549) | Cod sursa (job #272470)
Cod sursa(job #272470)
#include<stdio.h>
#define INPUT "distante.in"
#define OUTPUT "distante.out"
#define NMAX 50001
FILE *fin = fopen(INPUT, "r"), *fout = fopen(OUTPUT, "w");
struct Graph
{
long Node;
long Cost;
Graph *Next;
};
int T;
long N, M, S;
long Roads[ NMAX ];
Graph *List[ NMAX ];
void readData()
{
long Node1, Node2, CostN;
Graph *adr;
for(long i = 1; i <= NMAX; ++i)
List[ i ] = NULL;
fscanf(fin, "%ld %ld %ld", &N, &M, &S);
for(long i = 1; i <= N; ++i)
fscanf(fin, "%ld", Roads+i);
for(long i = 1; i <= N; ++i)
{
fscanf(fin, "%ld %ld %ld", &Node1, &Node2, &CostN);
adr = new Graph;
adr -> Node = Node2;
adr -> Cost = CostN;
adr -> Next = List[ Node1 ];
List[ Node1 ] = adr;
adr = new Graph;
adr -> Node = Node1;
adr -> Cost = CostN;
adr -> Next = List[ Node2 ];
List[ Node2 ] = adr;
}
}
void solve()
{
Graph *adr;
int OK = 1;
for(long i = 1; i <= N && OK; ++i)
{
if(i != S){
adr = List[ i ];
OK = 0;
while(adr != NULL)
{
if(Roads[ adr -> Node ] + adr -> Cost == Roads[ i ])
{
OK = 1;
break;
}
adr = adr -> Next;
}
}
else
if(Roads[ i ] != 0) OK = 0;
}
if(OK)
fprintf(fout, "DA\n");
else
fprintf(fout, "NU\n");
}
int main()
{
fscanf(fin, "%d", &T);
for(int i = 0; i < T; ++i)
{
readData();
solve();
}
fclose(fin);
fclose(fout);
return 0;
}