Cod sursa(job #536184)

Utilizator tudorsTudor Siminic tudors Data 18 februarie 2011 12:50:22
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <stdio.h>
#define INF 1<<20
#include <vector>
using namespace std;

typedef struct {int v,c;} NOD;
NOD q;
int t,i,z;
int n,m,v;
int a,b,c,ok;
int R[50001],C[1<<18],COST[1<<18];
vector <NOD> A[50001];
FILE *f,*g;

void bf(int v)
{
	int p=0,u=0;
	int x,r,varf,cost;
	p++;
	u++;
	C[p]=v;
	while (p<=u)
	{
		x=C[p++];
		for (r=0;r<A[x].size();++r)
		{
			varf=A[x][r].v;
			cost=A[x][r].c;
			if (COST[x]+cost>=COST[varf])
				continue;
			C[++u]=varf;
			COST[varf]=COST[x]+cost;
		}
	}
}

int main()
{
	f=fopen("distante.in","r");
	g=fopen("distante.out","w");
	
	fscanf(f,"%d",&t);
	for (z=1;z<=t;++z)
	{
		fscanf(f,"%d %d %d",&n,&m,&v);
		for (i=1;i<=n;++i)
			fscanf(f,"%d",&R[i]);
		for (i=1;i<=m;++i)
			A[i].clear();
		for (i=1;i<=n;++i)
		{
			COST[i]=INF;
			C[i]=0;
		}
		COST[v]=0;
		for (i=1;i<=m;++i)
		{
			fscanf(f,"%d %d %d",&a,&b,&c);
			q.v=b;
			q.c=c;
			A[a].push_back(q);
			q.v=a;
			A[b].push_back(q);
		}
		bf(v);
		ok=1;
		for (i=1;i<=n;++i)
			if (R[i]!=COST[i])
			{
				ok=0;
				break;
			}			
		if (ok)
			fprintf(g,"DA\n");
		else
			fprintf(g,"NU\n");
	}
	fclose(f);
	fclose(g);
	return 0;
}