Cod sursa(job #688603)

Utilizator an_drey_curentandreycurent an_drey_curent Data 23 februarie 2012 18:18:00
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include<stdio.h>
#include<vector>
#include<queue>
#include<limits.h>
#define NMAX 50005
using namespace std;
int D[NMAX],N,M,T,S,BRONZAREL[NMAX];
vector< pair<int,int> >V[NMAX];
queue<int>COADA;bool EXISTENTA[NMAX];
void deschidere()
{
	freopen("distante.in","r",stdin);
	freopen("distante.out","w",stdout);
}
void afisare()
{
	int i;
	for(i=1;i<=N;i++)
		if(BRONZAREL[i]!=D[i])
		{printf("NU\n");return;}
	printf("DA\n");return;
}
void initializare()
{
	for(int i=1;i<=N;i++)
		D[i]=INT_MAX,EXISTENTA[i]=0;
}
void initializare2()
{
	for (int i=1;i<=N;i++)
		V[i].clear();
}
void rezolvare()
{
	COADA.push(S);
	EXISTENTA[S]=1;
	D[S]=0;
	while(COADA.size())
	{
		int nod=COADA.front();
		for(int i=0;i<V[nod].size();i++)
			if(D[V[nod][i].first]>D[nod]+V[nod][i].second)
			{
				D[V[nod][i].first]=D[nod]+V[nod][i].second;
				if(!EXISTENTA[V[nod][i].first])
				{
					COADA.push(V[nod][i].first);
					EXISTENTA[V[nod][i].first]=1;
				}
			}
			COADA.pop();
	}				
}
void citire()
{
	int X,Y,C,i;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d%d",&N,&M,&S);
		for(i=1;i<=N;i++)
			scanf("%d",&BRONZAREL[i]);
		while(M--)
		{
			scanf("%d%d%d",&X,&Y,&C);
			V[X].push_back(make_pair(Y,C));
		}
		initializare();
		rezolvare();
		afisare();
		initializare2();
	}
}
int main()
{
	deschidere();
	citire();
	return 0;
}