Pagini recente » Monitorul de evaluare | Cod sursa (job #2474868) | Cod sursa (job #721814) | Monitorul de evaluare | Cod sursa (job #302079)
Cod sursa(job #302079)
#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));
}
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 ] + it->second < D[ it->first] )
{
fprintf(fout, "NU\n");
return;
}
if(D[ i ] == D[ it->first ] + it->second) viz[ i ] = 1;
}
}
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;
}