Pagini recente » Cod sursa (job #2623421) | Cod sursa (job #1205135) | Cod sursa (job #2927850) | Cod sursa (job #1672434) | Cod sursa (job #1691159)
# include <fstream>
# include <algorithm>
# include <queue>
# include <vector>
# include <climits>
# define INF numeric_limits<int>::max()
using namespace std;
ifstream f ( "distante.in" );
ofstream g ( "distante.out" );
int n, m;
vector < int > dist;
vector < vector < pair < int, int > > > A;
struct cmp {
int operator()( int x, int y ) {
return dist[x] > dist[y];
}
};
priority_queue < int, vector < int >, cmp > q;
void Dijkstra( int sursa ) {
dist[sursa] = 0;
q.push( sursa );
while ( !q.empty() ) {
int x = q.top(); q.pop();
for ( auto it: A[x] ) {
if ( dist[it.first] > dist[x] + it.second ) {
dist[it.first] = dist[x] + it.second;
q.push( it.first );
}
}
}
}
int main()
{
int teste; f >> teste;
while ( teste -- ) {
int sursa;
f >> n >> m >> sursa;
vector < int > d( n + 1 );
for ( int i = 1; i <= n; ++ i ) {
f >> d[i];
}
A = vector < vector < pair < int, int > > > ( n + 1 );
for ( int i = 0; i < m; ++ i ) {
int x, y, cost; f >> x >> y >> cost;
A[x].push_back( make_pair( y, cost ) );
A[y].push_back( make_pair( x, cost ) );
}
dist = vector < int > ( n + 1, INF );
Dijkstra( sursa );
bool ok = true;
for ( int i = 1; i <= n; ++ i ) {
if ( d[i] != dist[i] ) {
ok = false;
}
}
if ( ok ) g << "DA" << '\n';
else g << "NU" << '\n';
}
return 0;
}