Cod sursa(job #2797860)

Utilizator alexdmnDamian Alexandru alexdmn Data 10 noiembrie 2021 17:54:17
Problema Distante Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <fstream>
#include <queue>

using namespace std;
priority_queue <pair<int, int> > q;
vector <int> v[50005],co[50005];
int best[50005],sol[50005];
int main()
{
	ifstream cin("distante.in");
	ofstream cout("distante.out");

    int t,n,m,s,a,b,c,ok=0;
    pair <int, int> pa,ca;
    cin>>t;

    for(int k=0;k<t;k++)
	{
		cin>>n>>m>>s;
		for(int h=1;h<=n;h++)
		{
			cin>>sol[h];
			v[h].clear();
			co[h].clear();
			best[h]=-1000000;
		}
		for(int h=1;h<=m;h++)
		{
			cin>>a>>b>>c;
			v[a].push_back(b);
			co[a].push_back(c);
			v[b].push_back(a);
			co[b].push_back(c);
		}

		pa.first=0;
		pa.second=s;
		best[s]=0;
		q.push(pa);
		while(!q.empty())
		{
			pa=q.top();
			q.pop();
			if(pa.first==best[pa.second])
			{
				for(int i=0;i<v[pa.second].size();i++)
				{
					ca.first=co[pa.second][i]*(-1)+pa.first;
					ca.second=v[pa.second][i];
					if(ca.first>best[ca.second])
					{
						best[ca.second]=ca.first;
						q.push(ca);
					}
				}
			}
		}

		ok=0;
		for(int i=1;i<=n;i++)
		{
			if(best[i]==-1000000)
				best[i]=0;
			if(sol[i]!=best[i]*(-1))
			{
				ok=1;
				break;
			}
		}
		if(ok==1)
			cout<<"NU"<<'\n';
		else
			cout<<"DA"<<'\n';
	}

    return 0;
}