Cod sursa(job #673735)

Utilizator federerUAIC-Padurariu-Cristian federer Data 4 februarie 2012 20:30:55
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include<fstream>
#define Nmax 50001
#define Inf 10001
using namespace std;

long long i, j, k, g, pre[Nmax], d[Nmax], dist[Nmax], a, b;
long long C[10001][10001], ok, vfmin, dmin, M[Nmax], s, c, n, m;


ifstream fin("distante.in");
ofstream fout("distante.out");

void initializare()
{
	for(i=1;i<=n;i++)
			for(j=i+1;j<=n;j++)
				C[i][j]=C[j][i]=Inf;
		for(i=1;i<=m;i++)
		{
			fin>>a>>b>>c;
			C[a][b]=C[b][a]=c;
		}
		for(i=1;i<=n;i++)
		{d[i]=C[s][0], pre[i]=s;}
		pre[s]=0;M[s]=1;
}

int main()
{
	fin>>g;
	for(k=1;k<=g;k++)
	{
		fin>>n>>m>>s;
		for(i=1;i<=n;i++)
			fin>>dist[i];
		initializare();
		for(j=1;j<n;j++)
		{
			dmin=Inf;
			for(i=1;i<=n;i++)
				if(!M[i] && d[i]>dmin)
				{
					dmin=d[i];
					vfmin=i;
				}
			M[vfmin]=1;
			for(i=1;i<=n;i++)
				if(!M[i] && d[i]>dmin+C[i][vfmin])
				{
					pre[i]=vfmin;
					d[i]=dmin+C[i][vfmin];
				}
		}
		ok=1;
		for(i=1;i<=n&&ok==1;i++)
			if(d[i]!=dist[i])
				ok=0;
		if(ok==1)
			fout<<"DA\n";
		else
			fout<<"NU\n";
	}
	fin.close();
	fout.close();
	return 0;
}