Pagini recente » Cod sursa (job #1462816) | Cod sursa (job #2746925) | Cod sursa (job #1341260) | Cod sursa (job #1712645) | Cod sursa (job #1424162)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
#define INF 2000000000
#define DIM 50010
#define f first
#define s second
ifstream fin("distante.in");
ofstream fout("distante.out");
queue <int> Q;
vector < pair< int , int > > Edge[ DIM ];
int n,m,a,b,c,I,T,myAns[DIM],theirAns[DIM],curPoz,curSize,curAsc,curCost,z,i,ans;
int main()
{
fin>>T;
for( I = 1 ; I <= T ; ++I )
{
fin>>n>>m>>z;
for( i = 1 ; i <= n ; ++i )
myAns[ i ] = INF;
myAns[ z ] = 0;
for( i = 1 ; i <= n ; ++i )
fin>>theirAns[ i ];
for( i = 1 ; i <= m ; ++i )
{
fin>>a>>b>>c;
Edge[ a ].push_back( make_pair( b , c ) );
}
Q.push( z );
while( !Q.empty() )
{
curPoz = Q.front();
curSize = Edge[ curPoz ].size();
for( i = 0 ; i < curSize ; ++i )
{
curAsc = Edge[ curPoz ][ i ].f;
curCost = Edge[ curPoz ][ i ].s;
if( myAns[ curAsc ] > myAns[ curPoz ] + curCost )
{
Q.push( curAsc );
myAns[ curAsc ] = myAns[ curPoz ] + curCost;
}
}
Q.pop();
}
ans = 1;
for( i = 1 ; i <= n ; ++i )
if( myAns[ i ] != theirAns[ i ] )
{
ans = 0;
break;
}
if( ans == 1 )
fout<<"DA\n";
else
fout<<"NU\n";
for( i = 1 ; i <= n ; ++i)
{
Edge[ i ].erase( Edge[ i ].begin() , Edge[ i ].end() );
}
}
return 0;
}