Cod sursa(job #558743)

Utilizator alex@ndraAlexandra alex@ndra Data 17 martie 2011 13:52:32
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include<fstream>
#include<vector>
#include<queue>
#include<algorithm>
#include<iostream>
using namespace std;

#define Nmax 50005
#define inf 1000000

vector<pair<int,int> >G[Nmax];
int n,m,d[Nmax],d2[Nmax],start;

void dijkstra()
{
	int nod;
    bool viz[Nmax];
	queue<int>Q;
	vector<pair<int, int> >::iterator it;
	
	memset(d,inf,sizeof(d));
	memset(viz,false,sizeof(viz));
	
	Q.push(start);
	viz[start]=true;
	d[start]=0;
	
	while(!Q.empty())
	{
		nod=Q.front();
		Q.pop();
		viz[nod]=false;
		
		for(it=G[nod].begin();it!=G[nod].end();it++)
			if(d[nod]+it->second<d[it->first])
			{
				d[it->first]=d[nod]+it->second;
	     		if(!viz[it->first])
				{
				  viz[it->first]=true;
				  Q.push(it->first);
				}
			}
	}
}


int main()
{
    int i, j, s, t,x, y,c;
    
	ifstream f("distante.in");
	   f>>t;
    ofstream g("distante.out");
    
    for(j=1;j<=t;j++)
    {
    
	  f>>n>>m>>s;
	  
	  for(i=2;i<=n;i++)
	    f>>d2[i];
	    
	  for(i=1;i<=m;i++)
	  {
		f>>x>>y>>c;
		G[x].push_back(make_pair(y,c));
	  }
    
    
    start=s;
    
	dijkstra();
	
	int ok=1;
	
	for(i=2;i<=n;i++)
	  if(d[i]!=d2[i])
	    {
           ok=0;
           break;
         }
         
   if(ok)
     g<<"DA\n";
   else
     g<<"NU\n";
  }
  f.close();
  g.close();
	return 0;
	
}