Pagini recente » Cod sursa (job #718163) | Cod sursa (job #1399621) | Cod sursa (job #1426343) | Cod sursa (job #3231690) | Cod sursa (job #302105)
Cod sursa(job #302105)
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
#define INPUT "distante.in"
#define OUTPUT "distante.out"
const long NMAX = 50001;
FILE *fin = fopen(INPUT, "r"), *fout = fopen(OUTPUT, "w");
long N, M, S, C;
long D[ NMAX ];
bool viz[ NMAX ];
vector< pair<long,long> > List[ NMAX ];
void readData()
{
long Node1, Node2, C;
memset(viz, 0, sizeof(viz));
fscanf(fin, "%ld %ld %ld", &N, &M, &S);
for(long i = 1; i <= N; ++i)
fscanf(fin, "%ld", &D[ i ]);
if(D[ S ])
{
fprintf(fout, "NU\n");
return;
}
for(long i = 1; i <= M; ++i)
{
fscanf(fin, "%ld %ld %ld", &Node1, &Node2, &C);
List[ Node1 ].push_back(make_pair(Node2, C));
List[ Node2 ].push_back(make_pair(Node1, C));
if(D[ Node1 ] + C < D[ Node2 ] || D[ Node2 ] + C < D[ Node1] )
{
fprintf(fout, "NU\n");
return;
}
}
vector<pair<long, long> >::iterator it;
for(long i = 1; i <= N; ++i)
for(it = List[ i ].begin(); it != List[ i ].end(); ++it)
if(D[ i ] == D[ it->first ] + it->second) viz[ i ] = true;
for(long i = 1; i <= N; ++i)
if(!viz[ i ] && i != S){
fprintf(fout, "NU\n");
return;
}
fprintf(fout, "DA\n");
}
int main()
{
int T;
fscanf(fin, "%d", &T);
for(;T--;)
{
readData();
}
fclose(fin);
fclose(fout);
return 0;
}