Cod sursa(job #744389)

Utilizator lucian666Vasilut Lucian lucian666 Data 8 mai 2012 16:30:19
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb


#include<fstream>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstring>
#include<utility>

#define NN 50001
#define INF 0x3f3f3f3f
#define pb push_back
#define ff first
#define ss second
#define mp make_pair

using namespace std;
ofstream out("distante.out");

vector<pair<int,int> >G[NN];
queue<int>Q;
int n,m,t,s,d[NN],cc[NN],v[NN];

void dijkstra(int);
int main()
{
	ifstream in("distante.in");
	in>>t;
	while(t)
	{
	
		in>>n>>m>>s;
		for(int i=1;i<=n;i++)
		{
			in>>d[i];
			v[i]=INF;
			G[i].clear();
		}
		int x,y,c;
		for(int j=1;j<=m;j++)
		{
			in>>x>>y>>c;
			G[x].pb(mp(y,c));
			G[y].pb(mp(x,c));
		}
		dijkstra(s);
		int pp=1;
		for(int i=1;i<=n;i++)
			if(cc[i]!=d[i])
				pp=0;
			if(pp)
				out<<"DA"<<'\n';
			else
				out<<"NU"<<'\n';
			--t;
	}
	return 0;
}

void dijkstra(int s)
{
	Q.push(s);
	memcpy(cc,v,sizeof(cc));
	cc[s]=0;
	int k;
	while(!Q.empty())
	{
		k=Q.front();
			for(int i=0;i<G[k].size();++i)
				if(cc[G[k][i].ff]>cc[k]+G[k][i].ss)
				{
					cc[G[k][i].ff]=cc[k]+G[k][i].ss;
					Q.push(G[k][i].ff);
				}
				Q.pop();
	}
}