Cod sursa(job #396653)

Utilizator bog29Antohi Bogdan bog29 Data 15 februarie 2010 18:16:01
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include<fstream>
#include<vector>
#include<queue>
#define dmax 50003
#define mult 10000000
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
int tst,n,m,s;
long long rs[dmax];
bool t[dmax];
struct muchie
{	int v;
	short int c;
};
vector<struct muchie>g[dmax];
queue<int>q;
void bellmanford()
{	long long dm[dmax],crt,ok,i;
	vector<struct muchie>::iterator it;
	for(i=1;i<=n;i++)
	{	dm[i]=mult;
		t[i]=0;
	}	
	dm[s]=0;
	q.push(s);
	t[s]=1;
	while(!q.empty() )
	{	crt=q.front();
		q.pop();
		t[crt]=0;
		for(it=g[crt].begin();it<g[crt].end();it++)
			if(dm[crt]<mult)
			{	if(dm[it->v] > dm[crt]+it->c)
				{	dm[it->v]=dm[crt]+it->c;
					if(!t[it->v])
					{	q.push(it->v);
						t[it->v]=1;
					}	
				}
			}
	}		
	ok=1;
	for(i=1;i<=n && ok;i++)
		if(dm[i]!=rs[i])ok=0;
	if(ok==1)out<<"DA"<<'\n';
	else out<<"NU"<<'\n';	
}	

int main()
{	int i,a,b,r;
	muchie w;
	in>>tst;
	for(;tst;tst--)
	{	in>>n>>m>>s;
		for(i=1;i<=n;i++)
			in>>rs[i];
		for(i=1;i<=m;i++)
		{	in>>a>>b>>r;
			w.c=r;
			w.v=a;
			g[b].push_back(w);
			w.v=b;
			g[a].push_back(w);
		}	
		bellmanford();
	}
	in.close();
	out.close();
	return 0;
}