Cod sursa(job #2400662)

Utilizator IordachescuAncaFMI Iordachescu Anca Mihaela IordachescuAnca Data 8 aprilie 2019 23:21:31
Problema Distante Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include<fstream>
#include<vector>
#include<set>
#define NMAX 50010
#define INF 1e9

using namespace std;

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

vector<pair<int,int>>G[NMAX];

int main()
{
	int t;
	fin >> t;

	for(int i = 0; i < t; i++)
	{
		int n, m, k;
		fin >> n >> m >> k;

		int ans[n+3]={0};
		for(int j = 1; j <= n; j++)
		{
			fin >> ans[j];
		}

		vector<int>dist(n+2,INF);
		dist[k] = 0;

		for(int j = 0; j < m; j++)
		{
			int x, y, cost;
			fin >> x >> y >> cost;
			G[x].push_back(make_pair(y, cost));
			G[y].push_back(make_pair(x, cost));
		}

		set<pair<int,int>>s;
		s.insert(make_pair(0, k));

		while(!s.empty())
		{
			int nod = s.begin()->second;
			s.erase(s.begin());

			vector<pair<int,int>>::iterator it;
			for(it = G[nod].begin();it != G[nod].end(); it++)
				{
					int nod1 = it->first;
					int cost = it->second;

					if(dist[nod1] > dist[nod] + cost)
					{
						if(dist[nod1] != INF)
						{
							s.erase(s.find(make_pair(dist[nod1],nod1)));
						}
						dist[nod1] = dist[nod] + cost;
						s.insert(make_pair(dist[nod1],nod1));
					}
				}
		}

		bool ok = 1;
		for(int i = 1; i <= n; i++)
		{
			if(dist[i] != ans[i])
			{
				ok = 0;
				break;
			}
		}
		
		if(ok == 1)
		{
			fout << "DA\n";
		}
		else
		{
			fout<<"NU\n";
		}

		for(int j = 1; j <= n; j++)
		{
			G[j].clear();
		}
	}

	fin.close();
	fout.close();
	return 0;
}