Cod sursa(job #479202)

Utilizator nautilusCohal Alexandru nautilus Data 23 august 2010 12:31:49
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include<fstream>
#include<vector>
#include<queue>
#define dmax 50005
#define inf 2147483646
using namespace std;

long n,m,s,distdata[dmax],dist[dmax];
vector<int>v[dmax];
vector<int>c[dmax];
queue<int> q;

void initializare()
{
 long i;
	
 for (i=1; i<=n; i++)
	 dist[i]=inf;
 
 dist[s]=0;
}


void parcurgere()
{
 long x,i;
	
 while (q.size())
	 {
	  x=q.front();
	  for (i=0; i<v[x].size(); i++)
		  if (dist[v[x][i]] > dist[x] + c[x][i])
			  {
			   dist[v[x][i]]=dist[x] + c[x][i];
			   q.push(v[x][i]);
			  }
	  q.pop();
	 }
}


int verificare()
{
 long i,ok=0;
	
 for (i=1; i<=n; i++)
	 if (distdata[i]!=dist[i])
		 {
		  ok=1;
		  break;
		 }
	
 return ok;
}


void stergere()
{
 long i;
 
 for (i=1; i<=n; i++)
	 {
	  v[i].clear();
	  c[i].clear();
	 }
}


int main()
{
 long t,i,j,x,y,z;
	
 ifstream fin("distante.in");
 ofstream fout("distante.out");
 fin>>t;
 for (j=1; j<=t; j++)
	 {
	  fin>>n>>m>>s;
	  for (i=1; i<=n; i++)
		  fin>>distdata[i];
	  for (i=1; i<=m; i++)
		  {
		   fin>>x>>y>>z;
		   v[x].push_back(y);
		   c[x].push_back(z);
		   v[y].push_back(x);
		   c[y].push_back(z);
		  }
	  
	  q.push(s);
	  initializare();
	  parcurgere();
	  if (verificare()==0)
		  fout<<"DA"<<'\n'; else
		  fout<<"NU"<<'\n';
	  stergere();
	 }
 
 fin.close();
 fout.close();
	
 return 0;
}