Cod sursa(job #425790)

Utilizator NemultumituMatei Ionita Nemultumitu Data 26 martie 2010 09:17:19
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
vector <pair<int,int> > andreea[50050];
int coada[1000000],d[50050],cost[50050];
bool v[50050],marc[50050];
int n,m,t,s;

void citire()
{
	scanf("%d%d%d",&n,&m,&s);
	for (int i=1;i<=n;++i)
		scanf("%d",&d[i]);
	int x,y,c;
	while (m--)
	{
		scanf("%d%d%d",&x,&y,&c);
		andreea[x].push_back(make_pair(y,c));
		andreea[y].push_back(make_pair(x,c));
	}
}


int main()
{
	freopen ("distante.in","r",stdin);
	freopen ("distante.out","w",stdout);
	scanf("%d",&t);
	while (t--)
	{
		citire();
		int r=1,p;
		coada[1]=s;
		marc[s]=1;
		memset(v,0,sizeof(v));
		memset(marc,0,sizeof(marc));
		memset(cost,0,sizeof(cost));
		v[s]=1;
		for (p=1;p<=r;++p)
		{
			int nod=coada[p%1000000];
			marc[nod]=0;
			for (int i=0;i!=andreea[nod].size();++i)
			{
				if (!v[andreea[nod][i].first]||andreea[nod][i].first!=s&&cost[andreea[nod][i].first]>cost[nod]+andreea[nod][i].second)
					if (!marc[andreea[nod][i].first])
					{
						marc[andreea[nod][i].first]=1;
						cost[andreea[nod][i].first]=cost[nod]+andreea[nod][i].second;
						v[andreea[nod][i].first]=1;
						++r;
						coada[r%1000000]=andreea[nod][i].first;
					}
			}
		}
		bool k=1;
		for (int i=1;i<=n;++i)
			if (cost[i]!=d[i])
				k=0;
		if (k)
			printf("DA\n");
		else
			printf("NU\n");
	}
	return 0;
}