Cod sursa(job #483319)

Utilizator petroMilut Petronela petro Data 7 septembrie 2010 23:03:17
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include<fstream>
#include<vector>
#include<queue>
#define inf 1000000000
#define M 50005
#define mp make_pair
#define pb push_back
using namespace std;

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

typedef vector< pair<long, long> > VI;
VI::iterator it;
long t,n,m,s,verif[M],d[M],viz[M];

void cit( VI a[M])
{
	long i,x,y,z;
	
	for(i=1;i<=n;++i)
		f>>verif[i];
	
	for(i=1;i<=m;++i)
	{
		f>>x>>y>>z;
		a[x].pb(mp(y,z));
		a[y].pb(mp(x,z));
	}
}

int drum(VI a[M])
{
	long i,x,y,z;
	queue<long> q;
	
	for(i=1;i<=n;++i)
	{
		d[i]=inf;
		viz[i]=0;
	}
	
	d[s]=viz[s]=0;
	q.push(s);
	
	while(!q.empty())
	{
		x=q.front();
		q.pop();
		viz[x]=0;
		
		for(it=a[x].begin(); it!=a[x].end(); ++it)
		{
			y=(*it).first;
			z=(*it).second;
			
			if(d[y]>d[x]+z) {d[y]=d[x]+z;
							 if(viz[y]==0) {q.push(y);
											viz[i]=1;}
							}
		}
	}
	for(i=1;i<=n;++i)
		if(verif[i]!=d[i]) return 0;
	return 1;
}

int main()
{
	int i;
	f>>t;
	for(i=1;i<=t;++i)
	{
		VI a[M];
		f>>n>>m>>s;
		cit(a);
		if(drum(a)) g<<"DA\n";
		else g<<"NU\n";
	}
	
	f.close();
	g.close();
	return 0;
}