Pagini recente » Cod sursa (job #2227431) | Cod sursa (job #1891187) | Cod sursa (job #360941) | Cod sursa (job #1960269) | Cod sursa (job #1724947)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
#define mult 500000000
int s, n, m, t, x, y, z;
int* dijkstra( vector<pair<int,int> > v[] )
{
vector<pair<int,int> > h;
h.push_back( make_pair( 0, s ) );
int *dist;
dist = new int[n+1];
for( int i = 1; i <= n; i ++ )
dist[i] = mult;
dist[s] = 0;
while( !h.empty() )
{
int nod;
int distanta;
nod = h.begin()->second;
distanta = -h.begin()->first;
pop_heap( h.begin(), h.end() );
h.pop_back();
for( vector<pair<int,int> >::iterator it = v[nod].begin(); it != v[nod].end(); it ++ )
if( dist[ it->first ] > distanta + it->second )
{
dist[ it->first ] = distanta + it->second;
h.push_back( make_pair( -dist[it->first], it->first ) );
push_heap( h.begin(), h.end());
}
}
return dist;
}
int verificare( int *d1, int *d2, int n )
{
for( int i = 1; i <= n; i ++ )
if( d1[i] != d2[i] )
return 0;
return 1;
}
int main()
{
f >> t;
for( int i = 0; i < t; i ++ )
{
f >> n >> m >> s;
int *d, *d2;
d = new int[n+1];
vector<pair<int,int> > v[n+1];
for( int j = 1; j <= n; j ++ )
f >> d[j];
for( int j = 0; j < m; j ++ )
{
f >> x >> y >> z;
v[x].push_back( make_pair( y, z) );
v[y].push_back( make_pair( x, z) );
}
d2 = dijkstra( v );
if( verificare( d, d2, n ) )
g << "DA\n";
else
g << "NU\n";
delete[] d;
delete[] d2;
}
return 0;
}