Pagini recente » Cod sursa (job #1350143) | Istoria paginii utilizator/oana_tosa15 | Cod sursa (job #2359940) | Cod sursa (job #981043) | Cod sursa (job #1065614)
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
const int inf= 1<<30;
const int nmax= 50000;
int d[nmax+1], gd[nmax+1];
bool u[nmax+1];
struct str {
int x, y;
};
vector <str> v[nmax+1];
struct str_cmp {
bool operator() ( const str &x, const str &y ) {
return x.y>y.y;
}
};
priority_queue <str, vector <str>, str_cmp> q;
inline str mp( int x, int y ) {
str sol;
sol.x= x;
sol.y= y;
return sol;
}
void dijkstra( int s ) {
q.push( mp(s, 0) );
while ( !q.empty() ) {
str x= q.top();
q.pop();
u[x.x]= 0;
for ( int i= 0; i<(int)v[x.x].size(); ++i ) {
if ( d[x.x]+v[x.x][i].y<d[v[x.x][i].x] ) {
d[v[x.x][i].x]= d[x.x]+v[x.x][i].y;
if ( u[v[x.x][i].x]==0 ) {
u[v[x.x][i].x]= 1;
q.push( mp(v[x.x][i].x, d[v[x.x][i].x]) );
}
}
}
}
}
int main( ) {
int t;
fin>>t;
for ( ; t>0; --t ) {
int n, m, s;
fin>>n>>m>>s;
for ( int i= 1; i<=n; ++i ) {
fin>>gd[i];
d[i]= inf;
}
d[s]= 0;
for ( ; m>0; --m ) {
int a, b, c;
fin>>a>>b>>c;
v[a].push_back( mp(b, c) );
v[b].push_back( mp(a, c) );
}
dijkstra(s);
int x= 1;
for ( int i= 1; i<=n; ++i ) {
if ( d[i]!=gd[i] ) {
x= 0;
break;
}
}
if ( x==1 ) {
fout<<"DA\n";
} else {
fout<<"NU\n";
}
}
return 0;
}