Cod sursa(job #2797145)

Utilizator alexdmnDamian Alexandru alexdmn Data 9 noiembrie 2021 12:55:15
Problema Distante Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <fstream>
#include <queue>

using namespace std;
priority_queue <pair<int, int> > q;
vector <int> v[50005],co[50005];
int best[50005],f[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];
		}
		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);
		}
		for(int i=0;i<50005;i++)
		{
			best[i]=1;
			f[i]=0;
		}

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

		ok=0;
		for(int i=1;i<=n;i++)
		{
			while(!v[i].empty())
			{
				v[i].pop_back();
				co[i].pop_back();
			}

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

    return 0;
}