Pagini recente » Cod sursa (job #1403232) | Cod sursa (job #875901) | Cod sursa (job #518431) | Cod sursa (job #492306) | Cod sursa (job #2274935)
#include <fstream>
#include <iostream>
#include <utility>
#include <vector>
#include <queue>
#define MAXN 50000
#define MAXM 100000
#define inf 1000000000
using namespace std;
priority_queue< pair<int, int> >heap;
int D[MAXN + 1], d[MAXN + 1];
vector< pair<int, int> >v[MAXN + 1];
void Dijkstra(int distanta, int start)
{
int i;
heap.push({distanta, start});
while(!heap.empty())
{
pair<int, int>nod = heap.top();
heap.pop();
pair<int, int>vecin;
for(i = 0; i < v[nod.second].size(); i++)
{
vecin.first = v[nod.second][i].second + -nod.first;
vecin.second = v[nod.second][i].first;
if(d[vecin.second] > vecin.first)
{
d[vecin.second] = vecin.first;
heap.push({-vecin.first, vecin.second});
}
}
}
}
int main()
{
int t, n, m, s, i, j, a, b, c, semafor;
ifstream fin("distante.in");
ofstream fout("distante.out");
fin >> t;
for(i = 1; i <= t; i++)
{
fin >> n >> m >> s;
for(j = 1; j <= n; j++)fin >> D[j];
for(j = 1; j <= m; j++)
{
fin >> a >> b >> c;
v[a].push_back({b, c});
v[b].push_back({a, c});
}
for(j = 1; j <= n; j++)d[j] = inf;
d[s] = 0;
if(d[s] == D[s])
{
Dijkstra(0, s);
for(j = 1; j <= n; j++)v[j].clear();
semafor = 1;
for(j = 1; j <= n && semafor == 1; j++)if(d[j] != D[j])semafor = 0;
if(semafor == 1)fout << "DA" << '\n';
else fout << "NU" << '\n';
}
else
fout << "NU" << '\n';
}
fin.close();
fout.close();
return 0;
}