Pagini recente » Planificare infoarena | Cod sursa (job #183577) | Rezultatele filtrării | Cod sursa (job #1850851) | Cod sursa (job #571563)
Cod sursa(job #571563)
#include <cstdio>
#include <vector>
using namespace std;
#define pb push_back
#define forit(it1, it2, v1, v2) for(__typeof(v1.begin()) it1 = v1.begin(), it2 = v2.begin(); it1 != v1.end(); ++it1, ++it2)
const int MAX_N = 50001;
int n, m, s;
int d[MAX_N];
vector <int> v[MAX_N], c[MAX_N];
int get()
{
if (d[s])
return 0;
for (int i = 1; i <= n; ++i)
if (i != s)
{
int ok = 0;
forit(it, cost, v[i], c[i])
{
if (d[*it] + *cost < d[i])
return 0;
if (d[*it] + *cost == d[i])
ok = 1;
}
if (!ok)
return 0;
}
return 1;
}
int main()
{
int i, t;
freopen("distante.in", "r", stdin);
freopen("distante.out", "w", stdout);
for (scanf("%d", &t); t; --t)
{
scanf("%d %d %d", &n, &m, &s);
for (i = 1; i <= n; ++i)
scanf("%d", &d[i]);
for (i = 1; i <= n; ++i)
v[i].clear(), c[i].clear();
for (i = 1; i <= m; ++i)
{
int x, y, z;
scanf("%d %d %d", &x, &y, &z);
v[x].pb(y);
c[x].pb(z);
v[y].pb(x);
c[y].pb(z);
}
printf("%s\n", (get()) ? "DA" : "NU");
}
}