Cod sursa(job #674677)

Utilizator bogdan353Costea Bogdan bogdan353 Data 6 februarie 2012 16:58:33
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include<fstream>
#include<vector>
#include<queue>
using namespace std;

#define mp make_pair
#define inf 0x3f3f3f3f


vector <pair <int , int> > lista[50002];
queue <int> Q;
int n,m,v[50002],cost[50002],G,s,d[50002];


void graf(int k)
{
	for(int i=1;i<=n;i++)
	{
		cost[i]=inf;
		v[i]=0;
	}
	
	Q.push(s);
	cost[s]=0;
	
	while(!Q.empty())
	{
		int nod =Q.front();
		for(unsigned int i=0;i<lista[nod].size();++i)
		{
			int nod2=lista[nod][i].first;
			int c2=lista[nod][i].second;
			
			if(cost[nod2]<=c2+cost[nod]) continue;
			
			Q.push(nod2);
			cost[nod2]=c2+cost[nod];
		}
		Q.pop();
	}
}
			
			



int main()
{
	ifstream f("distante.in");
	ofstream g("distante.out");
	
	f>>G;
	
	for(int i=1;i<=G;i++)
	{
		f>>n>>m>>s;
		
		for(int j=1;j<=n;j++)
			f>>d[j];
		int x,y,z;
		for(int j=1;j<=m;j++)
		{
			f>>x>>y>>z;
			lista[x].push_back(mp(y,z));
			lista[y].push_back(mp(x,z));
		}
		graf(s);
		
		bool ok=1;
		for(int j=1;j<=n;j++) 
		{
			if(cost[j]!=d[j]) ok=0;
			lista[j].clear();
		}
		
		
		if(ok==0) g<<"NU\n";
			else g<<"DA\n";
		
	}
}