Cod sursa(job #81920)

Utilizator peanutzAndrei Homorodean peanutz Data 5 septembrie 2007 11:55:45
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <stdio.h>
#include <memory.h>
#include <vector>

using namespace std;

#define NMAX 50002
#define INFI 0x3f3f3f3f

#define DIM 1000000
char buf[DIM];
int poz;

#define cin(x)						\
{							\
	x = 0;						\
	while(buf[poz] < '0' || buf[poz] > '9')		\
		if(++poz == DIM)			\
			fread(buf, 1, DIM, stdin), poz = 0;	\
	while(buf[poz] >= '0' && buf[poz] <= '9')	\
	{						\
		x = x*10 + (buf[poz]-'0');		\
		if(++poz == DIM)			\
			fread(buf, 1, DIM, stdin), poz = 0; 	\
	}						\
}							\

int t, n, m, s;
int d[NMAX];
vector<int> a[NMAX], c[NMAX];

void read()
{
	int i;
	int x, y, z;
	cin(n);
    cin(m);
    cin(s);
//    printf("%d %d %d\n", n, m, s);
	for(i = 1; i <= n; ++i)
	{
		cin(d[i]);
		a[i].clear(), c[i].clear();
	}
	for(i = 1; i <= m; ++i)
	{
		cin(x); cin(y); cin(z);
		a[x].push_back(y);
		c[x].push_back(z);
		a[y].push_back(x);
		c[y].push_back(z);
	}
}

void solve()
{
	int q[NMAX], dist[NMAX];
	short uz[NMAX];
	int inc, sf, x;
	vector<int> :: iterator itx, itc, fin;

	memset(uz, 0, sizeof(uz));
    memset(dist, INFI, sizeof(dist));
	inc = sf = 1;
	q[1] = s;
	dist[s] = 0;
	++uz[s];

	while(inc <= sf)
	{
		x = q[inc++];
		--uz[x];

		for(fin = a[x].end(), itx = a[x].begin(), itc = c[x].begin(); itx != fin; ++itx, ++itc)
		{
			if(dist[*itx] > dist[x] + *itc)
			{
				dist[*itx] = dist[x] + *itc;
				if(!uz[*itx])
				{
					++uz[*itx];
					q[++sf] = *itx;
				}
			}
		}
	}
	for(int i = 1; i <= n; ++i)
		if(dist[i] != d[i])
		{
			printf("NU\n");
			return ;
		}
	printf("DA\n");
}

int main()
{
	freopen("distante.in", "r", stdin);
	freopen("distante.out", "w", stdout);

	fread(buf, 1, DIM, stdin);
    cin(t);

	while(t--)
	{
        //printf("%d\n", t);
		read();
		solve();
	}
	return 0;
}