Cod sursa(job #559874)

Utilizator TudorLLesan Tudor TudorL Data 18 martie 2011 10:29:56
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <vector>
#include <set>
#include <fstream>
using namespace std;

#define INF 0x3f3f3f3f

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

vector <vector<int> > G, C;
set<pair<int, int> > T;

int d[100];
int d1[100];
int n, m, s, t;
int flag;
void Read();
void Dijkstra(int nod);


int main()
{
	Read();
	
	
	fin.close();
	fout.close();
	return 0;
}
void Read()
{
	fin >> t;
	int x, y, cost;
	while (t > 0)
	{
		memset(d, INF, sizeof(d));
		flag = 0;
		--t;
		fin >> n >> m >> s;
		G.resize(n+1);
		C.resize(n+1);
		for (int i = 1; i <= n; ++i)
			fin >> d[i];
		for (int i = 1; i <= m; ++i)
		{
			fin >> x >> y >> cost;
			G[x].push_back(y);
			C[x].push_back(cost);
			G[y].push_back(x);
			C[y].push_back(cost);
		}
		Dijkstra(s);
		for (int i = 1; i <= m; ++i)
			if (d[i] != d1[i])
			{	
				flag = 1;
				break;
			}
			if (flag == 1) fout << "NU\n";
			else fout << "DA\n";
		G.clear();
		C.clear();
	}
}
void Dijkstra(int nod)
{
	memset(d1, INF, sizeof(d1));
	int x, val;
	d1[nod] = 0;
	T.insert(make_pair(0, nod));
	
	while (T.size() > 0)
	{
		x = (*T.begin()).second;
		val = (*T.begin()).first;
		T.erase((*T.begin()));
		for (int i = 0; i < G[x].size(); ++i)
		{
			if (d1[G[x][i]] > d1[x] + C[x][i])
			{
				d1[G[x][i]] = d1[x] + C[x][i];
				T.insert(make_pair(d[G[x][i]], G[x][i]));
			}
		}
	}
}