Cod sursa(job #353077)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 4 octombrie 2009 01:27:58
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <stdio.h>
#include <vector>
#define N 1<<16
#define P 1<<20
#define inf 1000000000
using namespace std;
int t,n,m,s,dist[N],cost[N],coada[N],r;
vector <pair <int,int > > v[N];
char stiva[N];
void read()
{
	scanf("%d%d%d",&n,&m,&s);
	int i,x,y,z;
	for (i=1; i<=n; i++)
	{
		scanf("%d",&dist[i]);
		v[i].clear();
	}
	for (i=1; i<=m; i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		v[x].push_back(make_pair(y,z));
		v[y].push_back(make_pair(x,z));
	}
}
void solve()
{
	int i,j,ant=0,act,ok=1;
	for (i=1; i<=n; i++)
		cost[i]=inf,stiva[i]=0;
	r=0;
	coada[++r]=s;
	stiva[s]=1;
	cost[s]=0;
	while (ok)
	{
		act=r;
		ok=0;
		for (i=ant+1; i<=act; i++)
		{
			stiva[coada[i]]=0;
			for (j=0; j<v[coada[i]].size(); j++)
				if (cost[coada[i]]+v[coada[i]][j].second<cost[v[coada[i]][j].first])
				{
					cost[v[coada[i]][j].first]=cost[coada[i]]+v[coada[i]][j].second;
					if (!stiva[v[coada[i]][j].first])
					{
						coada[++r]=v[coada[i]][j].first;
						stiva[coada[r]]=1;
						ok=1;
					}
				}
		}
		ant=act;
	}
}
int main()
{
	freopen("distante.in","r",stdin);
	freopen("distante.out","w",stdout);
	int i,j;
	scanf("%d",&t);
	char ok;
	for (i=1; i<=t; i++)
	{
		read();
		solve();
		ok=1;
		for (j=1; j<=n; j++)
			if (cost[j]!=dist[j])
			{
				ok=0;
				break;
			}
		if (ok)
			printf("DA\n");
		else
			printf("NU\n");
	}
	return 0;
}