Pagini recente » Cod sursa (job #258603) | Cod sursa (job #3189986) | Cod sursa (job #1184000) | Cod sursa (job #3278488) | Cod sursa (job #2400662)
#include<fstream>
#include<vector>
#include<set>
#define NMAX 50010
#define INF 1e9
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
vector<pair<int,int>>G[NMAX];
int main()
{
int t;
fin >> t;
for(int i = 0; i < t; i++)
{
int n, m, k;
fin >> n >> m >> k;
int ans[n+3]={0};
for(int j = 1; j <= n; j++)
{
fin >> ans[j];
}
vector<int>dist(n+2,INF);
dist[k] = 0;
for(int j = 0; j < m; j++)
{
int x, y, cost;
fin >> x >> y >> cost;
G[x].push_back(make_pair(y, cost));
G[y].push_back(make_pair(x, cost));
}
set<pair<int,int>>s;
s.insert(make_pair(0, k));
while(!s.empty())
{
int nod = s.begin()->second;
s.erase(s.begin());
vector<pair<int,int>>::iterator it;
for(it = G[nod].begin();it != G[nod].end(); it++)
{
int nod1 = it->first;
int cost = it->second;
if(dist[nod1] > dist[nod] + cost)
{
if(dist[nod1] != INF)
{
s.erase(s.find(make_pair(dist[nod1],nod1)));
}
dist[nod1] = dist[nod] + cost;
s.insert(make_pair(dist[nod1],nod1));
}
}
}
bool ok = 1;
for(int i = 1; i <= n; i++)
{
if(dist[i] != ans[i])
{
ok = 0;
break;
}
}
if(ok == 1)
{
fout << "DA\n";
}
else
{
fout<<"NU\n";
}
for(int j = 1; j <= n; j++)
{
G[j].clear();
}
}
fin.close();
fout.close();
return 0;
}