Pagini recente » Cod sursa (job #1853545) | Cod sursa (job #336788) | Cod sursa (job #1872479) | Cod sursa (job #1982050) | Cod sursa (job #1144707)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <string.h>
using namespace std;
const int Nmax = 50005;
const int INF = 0x3f3f3f3f;
typedef pair<int, int> pii;
vector<pii> G[Nmax];
queue<int> Q;
int inQ[Nmax]; // 0-1 daca virful respectiv se afla in queue
int dist[Nmax]; // distantele corecte
int target[Nmax]; // distantele calculate de Bronzarel
int main()
{
ifstream f ("distante.in");
ofstream g ("distante.out");
int T, N, M, S, a, b, w;
f >> T;
for (int t = 0; t < T; t++)
{
f >> N >> M >> S;
S--;
memset(dist, INF, sizeof(dist));
memset(inQ, 0, sizeof(inQ));
//Q.clear();
for (int i = 0; i < N; i++)
G[i].clear();
for (int i = 0; i < N; i++)
f >> target[i];
for (int e = 0; e < M; e++) {
f >> a >> b >> w;
G[a-1].push_back(make_pair(b-1, w));
}
dist[S] = 0;
inQ[S] = 1;
Q.push(S);
while (!Q.empty()) {
int a = Q.front(); Q.pop();
inQ[a] = 0;
for (auto x: G[a]) {
if (dist[x.first] > dist[a] + x.second) {
dist[x.first] = dist[a] + x.second;
if (!inQ[x.first]) {
inQ[x.first] = 1;
Q.push(x.first);
}
}
}
}
bool ok = 1;
for (int i = 0; i < N; i++)
if (dist[i] != target[i]) {
ok = false;
break;
}
if (ok) g << "DA\n";
else g << "NU\n";
}
return 0;
}