Cod sursa(job #654590)

Utilizator maritimCristian Lambru maritim Data 30 decembrie 2011 17:49:23
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include<stdio.h>
#include<vector>
#include<fstream>
#include<queue>
using namespace std;

ifstream f("distante.in");
ofstream g("distante.out");

typedef vector<pair<int,int> >::iterator it;

#define MaxN 50010

int T,N,M,S,D[MaxN],viz[MaxN];
vector<pair<int,int> > A[MaxN];

void citire(void)
{
	int a,b,c;
	
	f >> N >> M >> S;
	
	for(int i=1;i<=N;i++)
		A[i].clear();
	
	for(int i=1;i<=N;i++)
		f >> D[i];
	for(int i=1;i<=M;i++)
	{
		f >> a >> b >> c;
		A[a].push_back(make_pair(b,c));
		A[b].push_back(make_pair(a,c));
	}
}

int DistanteCorecte(void)
{
	queue<int> Q;
	
	if(D[S]) return 0;
	
	for(int i=1;i<=N;i++)
		viz[i] = 0;  viz[S] = 1;
	
	for(Q.push(S);!Q.empty();Q.pop())
		for(it i=A[Q.front()].begin();i<A[Q.front()].end();i++)
			if(D[Q.front()]+i->second < D[i->first])
				return 0;
			else if(!viz[i->first] && D[Q.front()]+i->second == D[i->first])
				viz[i->first] = 1, Q.push(i->first);
	
	for(int i=1;i<=N;i++)
		if(!viz[i]) return 0;
	
	return 1;
}

int main()
{
	f >> T;
	for(int i=1;i<=T;i++)
	{
		citire();
		if(DistanteCorecte())
			g << "DA\n";
		else 
			g << "NU\n";
	}
	
	return 0;
}