Cod sursa(job #1336563)

Utilizator IulianBoboUAIC Boboc Iulian IulianBobo Data 7 februarie 2015 22:17:24
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;

#define MAX_N 50001
#define MAX_M 100001
#define INF 1<<30

int t, n, m,s,k;
int distBr[MAX_N];
int dist[MAX_N], h[MAX_N], poz[MAX_N];

ifstream f("distante.in");
ofstream g("distante.out");

vector<pair<int, int>> el[MAX_N];

int Q[MAX_N];
bool InQueue[MAX_N];

void readData()
{
	int a, b, c;
	f >> n >> m >> s;
	for (int i = 1; i <= n; ++i)
	{
		f >> distBr[i];
		InQueue[i] = false;
	}
	for (int i = 1; i <= m; i++)
	{
		f >> a >> b >> c;
		el[a].push_back(make_pair(b,c));
		el[b].push_back(make_pair(a, c));
	}
}

void compute()
{
	int p, u,i;
	bool ok = true;
	for (i = 1; i <= n; i++)
	{
		dist[i] = INF;
	}
	p = u = 1;
	Q[u] = s;
	dist[s] = 0;
	InQueue[Q[u]] = true;
	while (p <= u && ok)
	{

		for (vector<pair<int, int>>::iterator it = el[Q[p]].begin(); it != el[Q[p]].end(); it++)
		{
			if (dist[it->first] > dist[Q[p]] + it->second)
			{
				dist[it->first] = dist[Q[p]] + it->second;
				if (dist[it->first] < distBr[it->first]) ok = false;
				if (!InQueue[it->first])
				{
					InQueue[it->first] = true;
					Q[++u] = it->first;
				}
			}
		}
		InQueue[Q[p]] = false;
		++p;
	}

	if (!ok) g << "NU\n";
	else
	{
		for (i = 1; i <= n; i++) if (dist[i] != distBr[i]) break;
		if (i <= n) g << "NU\n";
		else g << "DA\n";
	}
}

int main()
{
	int i;
	f >> t;
	for (i = 1; i <= t; ++i)
	{
		readData();
		compute();
	}
	f.close();
	g.close();
	return 0;
}