Pagini recente » Cod sursa (job #1926019) | Cod sursa (job #64321) | Cod sursa (job #2367631) | Cod sursa (job #859646) | Cod sursa (job #1339595)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define INF 0x3f3f3f3f
#define MAX 50001
using namespace std;
ifstream is("distante.in");
ofstream os("distante.out");
int T, n, m, S, d[MAX], a[MAX];
bool ok[MAX];
vector<vector<pair<int, int>>> G;
queue<int> Q;
void Read();
void Solve( int s );
//void Reset();
int main()
{
Read();
is.close();
os.close();
return 0;
}
void Read()
{
is >> T;
while( T-- )
{
is >> n >> m >> S;
G.resize(n+1);
for ( int i = 1; i <= n; ++i )
is >> a[i];
while ( m-- )
{
int x, y, c;
is >> x >> y >> c;
G[x].push_back({y, c});
G[y].push_back({x, c});
}
Solve(S);
bool OK = false;
for ( int i = 1; i <= n; ++i )
if ( a[i] != d[i] )
OK = true;
if ( OK )
os << "NU\n";
else
os << "DA\n";
G.clear();
}
}
void Solve(int s)
{
Q.push(s);
memset(d, 63, sizeof(d) );
d[s] = 0;
int nod;
while ( !Q.empty() )
{
nod = Q.front();
Q.pop();
ok[nod] = false;
vector<pair<int, int>>::iterator it;
for ( it = G[nod].begin(); it != G[nod].end(); ++it )
{
if ( d[it->first] > d[nod] + it->second && !ok[it->first] )
{
d[it->first] = d[nod] + it->second;
Q.push(it->first);
ok[it->first] = true;
}
}
}
}