Pagini recente » Cod sursa (job #3128015) | Cod sursa (job #2849454) | Cod sursa (job #2150692) | Cod sursa (job #1514621) | Cod sursa (job #1389910)
#include <fstream>
#include <queue>
#include <algorithm>
#include <vector>
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
const int NMAX = 50000;
const int INF = ( 1 << 30 );
struct DAP {
int n,c;
};
struct cmp_DAP {
bool operator() ( DAP A, DAP B ) {
return ( A.c > B.c );
}
};
DAP make_DAP( int nod, int cost ) {
DAP aux;
aux.n = nod;
aux.c = cost;
return aux;
}
priority_queue < DAP, vector<DAP>, cmp_DAP > Hp;
vector <DAP> G[NMAX+3];
int dj[NMAX+3], id[NMAX+3];
int T, N, M, S;
int main() {
in >> T;
for( int t = 0; t < T; ++t ) {
while( !Hp.empty() ) Hp.pop();
in >> N >> M >> S;
for( int i = 1; i <= N; ++i ) {
in >> id[i];
dj[i] = INF;
}
for( int i = 1; i <= M; ++i ) {
int x,y,c;
in >> x >> y >> c;
G[x].push_back( make_DAP( y,c ) );
G[y].push_back( make_DAP( x,c ) );
}
dj[S] = 0;
Hp.push( make_DAP( S, 0 ) );
while( !Hp.empty() ) {
DAP Start = Hp.top();
Hp.pop();
for( int i = 0; i < (int)G[Start.n].size(); ++i ) {
DAP Final = G[Start.n][i];
if( dj[Start.n] + Final.c < dj[Final.n] ) {
dj[Final.n] = dj[Start.n] + Final.c;
Hp.push( make_DAP( Final.n, dj[Final.n] ) );
}
}
}
bool ok = 1;
for( int i = 1; i <= N && ok; ++i ) {
ok = ( ok && ( dj[i] == id[i] ) );
}
if( ok ) out << "DA\n";
else out << "NU\n";
}
in.close();
out.close();
return 0;
}