Cod sursa(job #1897018)

Utilizator nick12nicolae mihalache nick12 Data 1 martie 2017 09:00:16
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <bits/stdc++.h>
using namespace std;
#define pp pair<int,int>
int n;

//vector <pp> arr[50003];
int pr[50001];
int d[50001];
#define oo 1000000
priority_queue <pp> Q;
pp P;

 
int dis(int s,vector <pp> arr[50003])
{
    d[s] = 0;
    //prev[s] = 1;
    for (int i=0;i<n;i++)
    {
            if (i != s)
            {
               pr[i] = 0;
               d[i] = oo;
            }
 
      //  Q.push(make_pair(i,-d[i]));
    }
    Q.push(make_pair(0,s));
    while (Q.size())
    {
        pp u = Q.top();
        //cout << u.first<< endl << endl;
        Q.pop();
        if (pr[u.second] == 0)
        {
        pr[u.second] = 1;
        vector <pp> :: iterator it = arr[u.second].begin(),
        sf = arr[u.second].end();
        for (;it != sf;++it)
        {
 
            int alt = -u.first + (*it).second;
       //     printf("d init:%d %d %d %d\n",d[(*it).first],u.first,(*it).second,(*it).first);
            if (alt < d[(*it).first])
            {
                d[(*it).first] = alt;
               // prev[(*it).first] = u.first;
         //      cout << endl << "mp:" << (*it).first << endl;
                Q.push(make_pair(-d[(*it).first],(*it).first));
            }
        }
        }
    }
    return 1;
}

int main() {
	// your code goes here
	int t;
	freopen("distante.in","r",stdin);
	freopen("distante.out","w",stdout);
	cin >> t;
	while (t--)
	{
	vector <pp> arr[50003];
	int m,s;
	vector <int> ar;
	cin >> n >> m >> s;
	for (int i=0,z;i<n;i++)
	{
		cin >> z;
		ar.push_back(z);
	}
	for (int i=0;i<n;i++)
	{
		int a,b,c;
		cin >> a >> b >> c;
		arr[a-1].push_back(make_pair(b-1,c));
	}
	dis(s-1,arr);
	bool bul = true;
	for (int i=0;i<ar.size();i++)
	{
	//	cout << d[i] << " ";
		if (ar[i] != d[i])
			bul = false;
	}
	if (bul)
	cout << "DA\n";
	else cout << "NU\n";
//	arr.clear();
	}
	return 0;
}