Pagini recente » Cod sursa (job #2486203) | Cod sursa (job #2801951) | Cod sursa (job #1482302) | Cod sursa (job #1463535) | Cod sursa (job #1915663)
#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";
}
}