Pagini recente » Cod sursa (job #1371032) | Cod sursa (job #2831317) | Cod sursa (job #340917) | Cod sursa (job #1698262) | Cod sursa (job #1245546)
#include <fstream>
#include <queue>
#include <cstring>
#include <bitset>
#include <vector>
using namespace std;
#define NDIM 50001
#define MDIM 100001
#define INF 1<<28
ifstream is ("distante.in");
ofstream os ("distante.out");
int N, M, T, OG[NDIM], S, D[NDIM];
vector < pair <int,int> > v[NDIM];
bitset <NDIM> checked;
struct COMP{
bool operator ()(int a, int b)
{ return D[a] > D[b]; }
};
priority_queue <int, vector<int>, COMP> Q;
void Solve();
int main()
{
for (is >> T; T; --T) Solve();
is.close();
os.close();
};
void Solve()
{
is >> N >> M >> S;
for (int i = 1; i <= N; ++i)
D[i] = INF;
checked.reset();
for (int i = 1; i <= N; ++i)
is >> OG[i];
for (int i = 1, a, b, c; i <= M; ++i)
is >> a >> b >> c, v[a].push_back({b, c}), v[b].push_back({a, c});
D[S] = 0;
Q.push(S);
for (int i, nod, cost; !Q.empty(); )
{
i = Q.top(); Q.pop();
checked[i] = 1;
for (int j = 0; j < v[i].size(); ++j)
{
nod = v[i][j].first;
cost = v[i][j].second;
if ( !checked[nod] && D[nod] > D[i] + cost)
{
D[nod] = D[i] + cost;
Q.push(nod);
}
}
for (; !Q.empty() && checked[Q.top()]; Q.pop());
}
for (int i = 1; i <= N; ++i)
{
if (D[i] != OG[i])
{
os << "NU\n";
break;
}
if (i == N && D[i] == OG[i])
os << "DA\n";
}
for (int i = 1; i <= N; ++i)
v[i].clear();
};