Cod sursa(job #516023)

Utilizator siminescuPaval Cristi Onisim siminescu Data 22 decembrie 2010 22:13:06
Problema Distante Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#include<fstream>
#include<vector>
#include<queue>
using namespace std;

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

#define nmax 50002
typedef struct noduri{int vec,dist;};
noduri aux;
vector <noduri> v[nmax];
queue <int> Q;
int n,m,t,S,d[nmax],l[nmax];
bool inQ[nmax];

void afisare()
{
	int i;
	if(d[S])
	{
		g<<"NU"<<'\n'; return;
	}
	Q.push(S); inQ[S]=1;
		while(!Q.empty())
		{
			S=Q.front(); inQ[S]=0; Q.pop();
			for(i=0;i<l[S];i++)
				if(d[v[S][i].vec]>d[S]+v[S][i].dist)
				{
					g<<"NU"<<'\n';
					return;
				}
		}
	g<<"DA"<<'\n';
	return;
}
int main()
{
	f>>t;
	int i;
	for(;t;--t)
	{
		f>>n>>m>>S;
		for(i=1;i<=n;i++)
		{
			f>>d[i];
			l[i]=0;
			while(!v[i].empty()) v[i].pop_back();
		}
		d[S]=0;
		for(;m;--m)
		{
			f>>i>>aux.vec>>aux.dist;
			v[i].push_back(aux);
		}
		for(i=1;i<=n;i++) l[i]=v[i].size();
		afisare();
	}
}