Cod sursa(job #402695)

Utilizator zalmanDanci Emanuel Sebastian zalman Data 24 februarie 2010 08:30:01
Problema Distante Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <cstdio>
#include <vector>
#include <queue>
#define NMAX 200
using namespace std;

FILE *f = fopen("distante.in", "r"), *g = fopen("distante.out", "w");
struct nodus
{
	int cost, nod;
}ob;
vector<nodus> v[NMAX];
int T, N, M, S, i, j;
int outCost[NMAX], inCost[NMAX];

void read(void)
{
	int x, y, z;
	fscanf(f, "%d%d%d", &N, &M, &S);
	for(i = 1; i <= N; ++i)
		fscanf(f, "%d", &inCost[i]);
	for(i = 1; i <= M; ++i)
	{
		fscanf(f, "%d%d%d", &x, &y, &z);
		ob.nod = y;
		ob.cost = z;
		v[x].push_back(ob);
		ob.nod = x;
		v[y].push_back(ob);
		
	}

}
void calc(void)
{
	queue<nodus> q;
	memset(outCost, -1, (N + 1) * sizeof(int));
	ob.cost = 0;
	ob.nod = S;
	outCost[S] = 0;
	q.push(ob);
	while(!q.empty())
	{
		nodus el = q.front();
		q.pop();
		int nod = el.nod;
 		for(i = 0; i < v[nod].size(); ++i)
		{
			int adiacNod = v[nod][i].nod, adiacCost = v[nod][i].cost;
			if(outCost[adiacNod] == -1 || outCost[adiacNod] > outCost[nod] + adiacCost)
			{
				outCost[adiacNod] = outCost[nod] + adiacCost;
				q.push(v[nod][i]);
			}
		}
	}
	
}
bool isok(void)
{
	for(i = 1; i <= N; ++i)
		if(inCost[i] != outCost[i])
			return 0;
	return 1;
}
void ar(void)
{
	fscanf(f, "%d", &T);
	for(; T; --T)
	{
		read();
		calc();
		if(isok())
			fprintf(g, "DA\n");
		else
			fprintf(g, "NU\n");
		for(i = 1; i <= N; ++i)
			v[i].clear();
	}

	
}
int main(void)
{
	ar();
	
	fclose(f);
	fclose(g);
	return 0;
}