Pagini recente » Cod sursa (job #3004789) | Cod sursa (job #2263313) | Cod sursa (job #2904006) | Cod sursa (job #163366) | Cod sursa (job #2458618)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define N 50005
#define inf 1 << 30
using namespace std;
ifstream fin( "distante.in" );
ofstream fout( "distante.out" );
typedef pair < int, int > pii;
int n, m, t;
vector <int> Ad[N];
vector <int> Cost[N];
bool viz[N];
int dist[N], d[N];
void initialize()
{
int i;
memset( dist, 0, sizeof( dist ) );
memset( viz, 0, sizeof( viz ) );
for ( i = 1; i <= n; ++i )
{
Ad[i].clear();
Cost[i].clear();
}
}
void dijkstra( int start )
{
int i, w, nod;
priority_queue < pii, vector < pii >, greater < pii > > Heap;
for ( i = 1; i <= n; ++i )
d[i] = inf;
d[start] = 0;
Heap.push( make_pair( 0, start ) );
while ( !Heap.empty() )
{
nod = Heap.top().second; Heap.pop();
if ( viz[nod] ) continue;
else viz[nod] = 1;
for ( i = 0; i < Ad[nod].size(); ++i )
{
w = Ad[nod][i];
if ( d[w] > d[nod] + Cost[nod][i] )
{
d[w] = d[nod] + Cost[nod][i];
Heap.push( make_pair( d[w], w ) );
}
}
}
for ( i = 1; i <= n; ++i )
if ( d[i] != 0 )
if ( d[i] != dist[i] )
{
fout << "NU\n";
return;
}
fout << "DA\n";
}
void solve()
{
int i, j, a, b, c;
int start;
fin >> t;
for ( i = 1; i <= t; ++i )
{
initialize();
fin >> n >> m >> start;
for ( j = 1; j <= n; ++j )
fin >> dist[j];
for ( j = 1; j <= m; ++j )
{
fin >> a >> b >> c;
Ad[a].push_back( b );
Cost[a].push_back( c );
}
dijkstra( start );
}
}
int main()
{
solve();
fin.close();
fout.close();
return 0;
}