Cod sursa(job #766953)

Utilizator alex_ovidiunituAlex Ovidiu Nitu alex_ovidiunitu Data 12 iulie 2012 15:12:25
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include<iostream>
#include<fstream>
#include<queue>
#include<vector>
#include<cstring>
#include<bitset>
using namespace std;
struct s{int n,c;};
int n,m,S,dist[50001],bronz[50001];
vector <s> a[50001];
void belman_ford(int nod)
{
	queue <int> q;
	int i,c,costc;
	q.push(nod);
	while (!q.empty())
	{
		nod=q.front();
		q.pop();
		for (i=0;i<a[nod].size();i++)
		{
			c=a[nod][i].n;
			costc=a[nod][i].c;
			if (dist[c]==0 || dist[c]>dist[nod]+costc)
			{
				dist[c]=dist[nod]+costc;
				q.push(c);
			}
		}
	}
}
int check()
{
	int i;
	for(i=1;i<=n;i++)
		if (dist[i]!=bronz[i])
			return 0;
	return 1;
}
void zero(int a[], int n)
{
	int i;
	for (i=1;i<=n;i++)
		a[i]=0;
}
int main(void)
{
	fstream f,g;
	f.open("distante.in",ios::in);
	g.open("distante.out",ios::out);
	int t,q,i,x;
	f>>t;
	s z,l;
	for (q=1;q<=t;++q)
	{
		
		f>>n>>m>>S;
		for (i=1;i<=n;i++)
			f>>bronz[i];
		for (i=1;i<=m;i++)
		{
			f>>x>>z.n>>z.c;
			a[x].push_back(z);
			l.n=x;
			l.c=z.c;
			a[z.n].push_back(l);
		} 
		zero(dist,n);
		belman_ford(S);
		dist[S]=0;
		if (check())
			g<<"DA\n";
		else
			g<<"NU\n";
	}
}