Cod sursa(job #743805)

Utilizator lucian666Vasilut Lucian lucian666 Data 5 mai 2012 22:33:41
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb


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

#define INF 0x3f3f3f3f
#define f first
#define s second
#define mp make_pair
#define pb push_back
#define NN 50001

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

vector<pair<int,int> >G[NN];
int n,m,s,d[NN],v[NN],d2[NN];

void read();
void solve();
void dijkstra(int );

int main()
{
	
	int t;
	in>>t;
	for(;t;--t)
	{
	read();
	dijkstra(s);
	solve();
	}
	return 0;
}


void read()
{
	
	in>>n>>m>>s;
	for(int ii=1;ii<=n;ii++)
		in>>d2[ii];
	int i,j,c;
	for(;m;--m)
	{
		in>>i>>j>>c;
		G[i].pb(mp(j,c));
		G[j].pb(mp(i,c));
	}
}

void dijkstra(int start)
{
	memset(d,INF,sizeof(d));
	memset(v,0,sizeof(v));
	int i,j,k,poz;
	for(i=0;i<G[start].size();++i)
		d[G[start][i].f]=G[start][i].s;
	for(i=1;i<n;i++)
	{
		int minim=INF;
			for(j=1;j<=n;j++)
				if(d[j]<minim&&!v[j])
				{
					minim=d[j];
					poz=j;
				}
				v[poz]=1;
					for(k=0;k<G[poz].size();++k)
						if(d[G[poz][k].f]>d[poz]+G[poz][k].s)
							d[G[poz][k].f]=d[poz]+G[poz][k].s;
	}
}

void solve()
{
	int pp=1;
	d[s]=0;
	for(int i=1;i<=n;i++)
		if(d[i]!=d2[i])
		{
			pp=0;
			break;
		}
		if(pp)
			out<<"DA"<<'\n';
		else
			out<<"NU"<<'\n';
}