Cod sursa(job #482157)

Utilizator cosmyoPaunel Cosmin cosmyo Data 2 septembrie 2010 18:01:54
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include<fstream.h>
#include<vector>
#include<queue>
#define NMAX 50005
#define mp make_pair
#define inf 100000000
using namespace std;
vector< pair<long,long> > a[NMAX];
vector<bool> v(NMAX);
vector<long> p(NMAX),d(NMAX);
queue<long> q;
long s,n,m,t;
void dijkstra(long n,long s)
{long i,k;
  for(i=1;i<=n;++i)
	  d[i]=inf;
  d[s]=0;
  q.push(s);
  v[s]=true;
   while(!q.empty())
   {k=q.front();
    v[k]=false;
     for(i=0;i<a[k].size();++i)
		 if(d[a[k][i].first]>d[k]+a[k][i].second)
		 {d[a[k][i].first]=d[k]+a[k][i].second;
		   if(!v[a[k][i].first])
		   {v[a[k][i].first]=true;
		    q.push(a[k][i].first);
		   }
		 }
	 q.pop();
   }
}
int main()
{ifstream fin("distante.in");
 ofstream fout("distante.out");
  long sw,i,j,x,y,c;
  fin>>t;
	   for(j=1;j<=t;++j)
	   {fin>>n>>m>>s;
	    for(i=1;i<=n;++i)
			a[i].clear();
	    for(i=1;i<=n;++i)
			fin>>p[i];
         for(i=1;i<=m;++i)
				{fin>>x>>y>>c;a[x].push_back(mp(y,c));a[y].push_back(mp(x,c));}
         dijkstra(n,s);
         sw=1;
 		  for(i=1;i<=n;++i)
			  if(d[i]==inf)
				  d[i]=0;
		  for(i=1;i<=n;++i)
			  if(d[i]!=p[i])
			  {sw=0;
			   break;
			  }
		  if(sw)
			  fout<<"DA\n";
		  else
			  fout<<"NU\n";
	   }
  fin.close();
  fout.close();
  return 0;
}