Pagini recente » Cod sursa (job #2368530) | Cod sursa (job #2458873) | Cod sursa (job #1129596) | Cod sursa (job #2590870) | Cod sursa (job #2590882)
#include <bits/stdc++.h>
#define NMAX 50005
#define oo (1 << 30)
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
int d[NMAX], dist[NMAX], x, y, n, m, i, vecin, cost, k, c, t, q;
bool viz[NMAX], ok;
vector <pair <int, int> > v[NMAX];
struct elem
{
bool operator()(int x, int y)
{
return d[x] > d[y];
}
};
priority_queue <int, vector <int>, elem> Q;
int main()
{
f >> t;
while(t --)
{
f >> n >> m >> q;
for(i = 1; i <= n; ++ i)
{
f >> d[i];
dist[i] = oo;
viz[i] = 0;
}
for(i = 1; i <= m; ++ i)
{
f >> x >> y >> c;
v[x].push_back(make_pair(y, c));
v[y].push_back(make_pair(x, c));
}
dist[q] = 0;
viz[q] = 1;
Q.push(q);
while(!Q.empty())
{
k = Q.top();
Q.pop();
viz[k] = 0;
for(i = 0; i < v[k].size(); ++ i)
{
vecin = v[k][i].first;
cost = v[k][i].second;
if(dist[vecin] > dist[k] + cost)
{
dist[vecin] = dist[k] + cost;
if(viz[vecin] == 0)
{
viz[vecin] = 1;
Q.push(vecin);
}
}
}
}
for(i = 2, ok = 0; i <= n; ++ i)
{
if(dist[i] == oo)
dist[i] = 0;
if(dist[i] != d[i])
{
ok = 1;
break;
}
}
if(ok == 1) g << "NU\n";
else g << "DA\n";
memset(v, 0, sizeof(v));
memset(d, 0, sizeof(d));
}
return 0;
}