Pagini recente » Cod sursa (job #1573330) | Cod sursa (job #94744) | Cod sursa (job #1384484) | Cod sursa (job #1674367) | Cod sursa (job #1466645)
#include <fstream>
#include <vector>
#include <queue>
#define NMAX 50001
#define inf 2000000000
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
int nrquiz, n, m, s, d1[NMAX], d[NMAX], a, b, c, i;
struct distante
{
int node, dist;
};
vector < distante > v[NMAX];
struct compare
{
bool operator () (distante &a, distante &b)
{
return a.dist > b.dist;
}
};
priority_queue < distante, vector < distante >, compare > pq;
void initialize()
{
for (i = 1; i <= n; ++ i)
d[i] = inf;
d[s] = 0;
}
void solve()
{
f >> n >> m >> s;
for (i = 1; i <= n; ++ i)
f >> d1[i];
for (i = 1; i <= m; ++i)
{
f >> a >> b >> c;
distante y;
y.node = b;
y.dist = c;
v[a].push_back(y);
y.node = a;
v[b].push_back(y);
}
initialize();
distante x;
x.node = s;
x.dist = 0;
pq.push(x);
while (!pq.empty())
{
int minim = pq.top().node;
pq.pop();
for (vector < distante > :: iterator it = v[minim].begin(); it != v[minim].end(); ++ it)
if (d[it -> node] > d[minim] + it -> dist)
{
d[it -> node] = d[minim] + it -> dist;
pq.push(*it);
}
}
bool ok = 1;
for (i = 1; i <= n; ++ i)
if (d[i] != d1[i])
{
ok = 0;
break;
}
if (ok) g << "DA\n";
else
g << "NU\n";
}
int main()
{
f >> nrquiz;
while (nrquiz)
{
nrquiz --;
solve();
}
return 0;
}