Cod sursa(job #401041)

Utilizator zalmanDanci Emanuel Sebastian zalman Data 22 februarie 2010 12:31:44
Problema Distante Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <iostream>
#include <ctime>
#include <vector>
#include <queue>
#define NMAX 50010
using namespace std;

int N, M, i, x, y, z, S;
FILE *f = fopen("distante.in", "r"), *g = fopen("distante.out", "w");

struct asd
{
	int cost, nod;
	bool operator < (const asd& var) const
	{
		return cost > var.cost;
	}
}w, ob;

vector<asd> v [ NMAX ];
priority_queue<asd> pq;
int cd[NMAX];
int final[NMAX];
int zxc[NMAX];

bool isok(void)
{
	for(i = 1; i <= N; ++i)
		if(cd[i] != zxc[i])
			return 0;
	return 1;
		
}
void dijkstra(void)
{
	memset(cd, -1, sizeof(cd));
	memset(final, 0, sizeof(final));
	w.cost = 0;
	cd[S] = 0;
	w.nod = S;
	pq.push(w);
	for(i = 1; i <= N;)
	//while(!pq.empty())
	{
		if(pq.empty())break;
		
		asd el = pq.top();
		pq.pop();
		if(final[el.nod] == 0)
		{
			++i;
			final[el.nod] = 1;
			for(int j = 0; j < v[el.nod].size(); ++j)
			{
				int nod = el.nod, adiacNod = v[nod][j].nod;
				int cost = el.cost, adiacCost = v[nod][j].cost + cost;
				if(final[adiacNod] == 0)
				{
					if(adiacCost < cd[adiacNod] || cd[adiacNod] == -1){
						cd[adiacNod]=adiacCost;
						
						w.cost = adiacCost;	w.nod = adiacNod; pq.push(w);
					}
				}
			}
		}
	}
}
void read(void)
{
	fscanf(f, "%d%d%d", &N, &M, &S);
		for(i = 1; i <= N; ++i)
			fscanf(f, "%d", &zxc[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 solve(void)
{
	int T;
	fscanf(f, "%d", &T);
	for(; T; --T)
	{
		read();
		dijkstra();
		if(isok())
			fprintf(g, "DA\n");
		else
			fprintf(g, "NU\n");
		for(i = 1; i <= N; ++i)
			v[i].clear();

	}	
	fclose(f);
	fclose(g);
}


int main(void)
{
	solve();
	
	return 0;
}