Pagini recente » Cod sursa (job #3041763) | Cod sursa (job #2193744) | Istoria paginii runda/oji_simulare_2017_cl10 | Cod sursa (job #2572885) | Cod sursa (job #1424271)
#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[ 11 ][ 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[ I ][ a ].push_back( make_pair( b , c ) );
Edge[ I ][ b ].push_back( make_pair( a , c ) );
}
Q.push( z );
while( !Q.empty() )
{
curPoz = Q.front();
curSize = Edge[ I ][ curPoz ].size();
for( i = 0 ; i < curSize ; ++i )
{
curAsc = Edge[ I ][ curPoz ][ i ].f;
curCost = Edge[ I ][ 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";
}
return 0;
}