Cod sursa(job #571563)

Utilizator raduzerRadu Zernoveanu raduzer Data 4 aprilie 2011 16:31:50
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#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");
	}
}