Cod sursa(job #1732207)

Utilizator theo.stoicanTheodor Stoican theo.stoican Data 21 iulie 2016 08:48:52
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
#include <algorithm>

using namespace std;

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

vector<vector<pair<int, int> > > g;
vector<int> dist;
//int n,m,s;

bool checkDijkstra(int n, int m, int s)
{
	if (dist[s] != 0)
		 return false;
	vector<bool> found (n+1, false);
	found[s] = true;
	for (int i = 1; i <= n; i++)
	{
//		found = false;
		//int mn = 50000000;
		if (i == s )
			continue;
		for (int j = 0; j < g[i].size(); j++)
		{
			//if (g[i][j].first != s )
			//{
		//	mn = min (mn, dist[g[i][j].first] + g[i][j].second);
				if (dist[i] == dist[g[i][j].first] + g[i][j].second)
				{
					found[i] = true;
				}
				else if (dist[i] > dist[g[i][j].first] + g[i][j].second)
				{
					return false;
				}

			//}
		}
		//if (mn != dist[i])
		//	return false;
		if (found[i] == false)
			return false;
	}
	return true;
}

int main()
{
	int t;
	int n,m,s;
	fin>>t;
	while (t != 0)
	{
		fin>>n>>m>>s;
		g.resize(n+1);
		dist.resize(n+1);
		for (int i = 1; i <= n; i++)
		{
			g[i].clear();
			fin>>dist[i];
		}
		for (int i = 1; i <= m; i++)
		{
			int a,b,c;
			fin>>a>>b>>c;
			g[a].push_back(make_pair(b,c));
			g[b].push_back(make_pair(a,c));
		}
		if (checkDijkstra(n,m,s) == false)
		{
			fout<<"NU\n";
		}
		else 
			fout <<"DA\n";
		t--;
	}
}