Cod sursa(job #1915663)

Utilizator ButmalaiDanButmalai Dan ButmalaiDan Data 8 martie 2017 21:57:46
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include<bits/stdc++.h>
using namespace std;
int t,n,m,z,x,y;
vector<pair<int,int> > a[100100];
set<pair<int,int> > s;
int comp[50500],c[50500];
int main()
{
	ifstream cin("distante.in");
	ofstream cout("distante.out");
	cin >>t;
	while(t--)
	{
		cin >> n >> m >> z;
		s.insert(make_pair(0,z));
		for (int i = 1; i <= n; i++) cin >> comp[i],c[i] = 1<<30;
		c[z] = 0;
		while(m--)
		{
			cin >> x >> y >> z;
			a[x].push_back(make_pair(z,y));
			a[y].push_back(make_pair(z,x));
		}
		while(!s.empty())
		{
			int nod = s.begin()->second;
			int cost = s.begin()->first;
			s.erase(s.begin());
			for(vector<pair<int,int> >::iterator it = a[nod].begin(); it != a[nod].end(); it++)
			{
				if (cost+it->first < c[it->second])
				{
					if (c[it->second] != 1<<30)
						s.erase(s.find(make_pair(c[it->second],it->second)));	
					c[it->second] = cost+it->first;
					s.insert(make_pair(c[it->second], it->second));
				}
			}
		}
		bool u = 1;
		for (int i = 1; i <= n; i++)
		{
			if (comp[i] != c[i]) u = 0;
			a[i].clear();
		}
		if(u)cout << "DA\n";
		else cout<< "NU\n";
	}
}