Pagini recente » Cod sursa (job #890514) | Cod sursa (job #328884) | Cod sursa (job #476372) | Cod sursa (job #711299) | Cod sursa (job #2117262)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
#define N_MAX 50005
int n, m, dist[N_MAX], rez[N_MAX];
void dijkstra(int start, vector <pair<int, int> > G[])
{
priority_queue <pair<int, int> > pq;
bool viz[N_MAX] ={0};
for(int i = 1; i <= n; i++)
dist[i] = (1 << 31) - 1;
dist[start] = 0;
pq.push({0,start});
while(!pq.empty())
{
pair<int, int> _top = pq.top();
pq.pop();
int nod = _top.second;
if(viz[nod])
continue;
viz[nod] = 1;
for(auto it:G[nod])
if(dist[nod] + it.second < dist[it.first])
{
dist[it.first] = dist[nod] + it.second;
pq.push(make_pair(-dist[it.first], it.first));
}
}
}
bool verif()
{
for(int i = 1; i <= n; i++)
if(rez[i] != dist[i]) return 0;
return 1;
}
int main()
{
int nod, k;
f >> k;
while(k--)
{
f >> n >> m >> nod;
for(int i = 1; i<= n; i++)
f >> rez[i];
int x, y, z;
vector <pair<int, int> > G[N_MAX];
for(int i = 1; i <= m; i++)
{
f >> x >> y >> z;
G[x].push_back(make_pair(y, z));
G[y].push_back(make_pair(x, z));
}
dijkstra(nod, G);
if(verif()) g << "DA\n";
else g << "NU\n";
}
return 0;
}