Pagini recente » Cod sursa (job #2819783) | Cod sursa (job #928745) | Cod sursa (job #1032218) | Cod sursa (job #2072772) | Cod sursa (job #496525)
Cod sursa(job #496525)
#include<cstdio>
#include<fstream>
#include<vector>
#include<string>
#define f first
#define s second
const int maxn = 50001;
using namespace std;
int i , j , t , n , m , S , d[maxn] , a , b ,c;
vector <pair < int , int > > G[maxn];
string check()
{
if ( d[S] != 0 ) return "NU\n";
for( i = 1 ; i <= n ; ++i )
if ( i != S ) {
bool ok = 0;
for( j = 0 ; j < G[i].size() ; ++j ) {
if ( d[i] + G[i][j].s < d[G[i][j].f] ) return "NU\n";
if ( (d[G[i][j].f] + G[i][j].s) == d[i]) ok = 1;
}
if ( !ok ) return "NU\n";
}
return "DA\n";
}
int main()
{
freopen("distante.in","r",stdin);
ofstream fout("distante.out");
scanf("%d",&t);
for( ; t-- ; ) {
scanf("%d %d %d",&n,&m,&S);
memset(d,0,sizeof(d));
for ( i = 1 ; i <= n ; ++i ) {
for( ; !G[i].empty(); ) G[i].pop_back();
scanf("%d",&d[i]);
}
for( i = 1 ; i <= m ; ++i ) {
scanf("%d %d %d",&a ,&b ,&c);
G[a].push_back(make_pair ( b , c ));
G[b].push_back(make_pair ( a , c ));
}
fout << check();
}
return 0;
}