Pagini recente » Cod sursa (job #474221) | Cod sursa (job #1540770) | Cod sursa (job #579731) | Cod sursa (job #213971) | Cod sursa (job #704899)
Cod sursa(job #704899)
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
using namespace std;
#define mp make_pair
#define pb push_back
#define OO 99999999
//================================================================================
ifstream f ( "distante.in" );
ofstream g ( "distante.out");
//================================================================================
vector < int > G[50100];
vector < int > C[50100];
set < pair < int , int > > T;
int n,m,Z,s,d[50100],sol[50100];
//================================================================================
void Read();
int Distanta( int );
//================================================================================
int main()
{
f >> Z;
for ( int i = 1; i <= Z ; i++ )
{
Read ();
if ( Distanta( s ) )
g << "DA" << '\n';
else
g << "NU" << '\n';
}
}
void Read ()
{
int x,y,d;
f >> n >> m >> s;
for ( int i = 1; i <= n ; i++ )
f >> sol[i];
for ( int i = 1; i <= m ; i++ )
{
f >> x >> y >> d;
G[x].pb(y);
C[x].pb(d);
}
}
int Distanta ( int x )
{
for ( int i = 1 ; i <= n ; i++ )
d[i] = OO;
d[x] = 0;
T.insert( mp ( 0, x ) );
int nod, c;
while ( T.size() > 0 )
{
c = (*T.begin()).first;
nod = (*T.begin()).second;
T.erase(*T.begin());
for ( unsigned int i = 0 ; i < G[nod].size() ; i++ )
{
if ( d[ G[nod][i] ] > c + C[nod][i] )
{
d[ G[nod][i] ] = c + C[nod][i];
T.insert ( mp ( d[ G[nod][i] ], G[nod][i] ) );
}
}
}
for ( int i = 1 ; i <= n ; i++ )
{
G[i].clear();
C[i].clear();
}
for ( int i = 1 ; i <= n ; i++ )
if ( d[i] != sol[i] )
return 0;
return 1;
}