Pagini recente » Cod sursa (job #2674840) | Cod sursa (job #1155089) | Rating Remus Dascalu (remusdc11) | Profil Petrovai | Cod sursa (job #1631444)
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
#include <cstring>
#define INF 0x3f3f3f3f
#define NMAX 50005
#define MMAX 100005
using namespace std;
ifstream is("distante.in");
ofstream os("distante.out");
int n, t, m, s;
queue <int> Q;
int d[50005], verif[50005];
void Dijkstra(vector <pair<int, int> > v[MMAX]);
int main()
{
is >> t;
bool ok = true;
int x, y, z;
for(int i = 1; i <= t; ++i)
{
is >> n >> m >> s;
vector < pair<int, int> > g[MMAX];
memset(d, INF, sizeof d);
memset(verif, 0, sizeof verif);
bool ok = true;
for(int j = 1; j <= n; ++j)
{
is >> verif[j];
}
for(int j = 1; j <= m;++j)
{
is >> x >> y >> z;
g[x].push_back({y, z});
g[y].push_back({x, z});
}
Dijkstra(g);
for(int j = 1; j <= n; ++j)
{
if(d[j] != verif[j])
{
ok = false;
}
}
if(ok)
os << "DA" << '\n';
else
os << "NU" << '\n';
}
is.close();
os.close();
return 0;
}
void Dijkstra(vector <pair<int, int> > v[MMAX])
{
d[s] = 0;
Q.push(s);
int x;
while(!Q.empty())
{
x = Q.front();
Q.pop();
for(vector<pair<int, int> >::iterator it = v[x].begin();it!= v[x].end(); ++it)
{
if(d[it->first] > d[x] + it->second)
{
d[it->first] = d[x] + it->second;
Q.push(it->first);
}
}
}
}
/*
for(const auto& y: v[x])
{
if(d[y.first] > d[x] + y.second)
{
d[y.first] = d[x] + y.second;
Q.push(y.first);
}
}
*/