Pagini recente » Cod sursa (job #1687312) | Cod sursa (job #1792837) | Cod sursa (job #2852953) | Cod sursa (job #182714) | Cod sursa (job #1075835)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin( "distante.in" );
ofstream cout( "distante.out" );
int d[ 50001 ], dProb[ 50001 ], q[ 50001 ];
int x, y, cost, n, m, t, dMin, vMin, s, teste;
vector<int> v[ 50001 ], c[ 50001 ];
int main()
{
int i, j, ok;
cin >> teste;
for ( t = 1; t <= teste; t++ )
{
cin >> n >> m >> s;
for ( i = 1; i <= n; i++ )
{
cin >> dProb[ i ];
d[ i ] = 9999999;
v[ i ].clear();
c[ i ].clear();
}
for ( i = 1; i <= m; i++ )
{
cin >> x >> y >> cost;
if ( x == s )
d[ y ] = cost;
v[ x ].push_back( y );
v[ y ].push_back( x );
c[ x ].push_back( cost );
c[ y ].push_back( cost );
}
q[ s ]++;
d[ s ] = 0;
for ( j = 1; j <= n; j++ )
{
dMin = 9999999;
for ( i = 1; i <= n; i++ )
if ( dMin > d[ i ] && q[ i ] < t )
{
dMin = d[ i ];
vMin = i;
}
q[ vMin ]++;
for ( i = 0; i < v[ vMin ].size(); i++ )
if ( q[ v[ vMin ][ i ] ] < t && d[ v[ vMin ][ i ] ] > d[ vMin ] + c[ vMin ][ i ] )
d[ v[ vMin ][ i ] ] = d[ vMin ] + c[ vMin ][ i ];
}
ok = 1;
for ( i = 1; i <= n; i++ )
if ( d[ i ] != dProb[ i ] )
{
cout << "NU" << '\n';
ok = 0;
break;
}
if ( ok ) cout << "DA" << '\n';
}
}