Pagini recente » Cod sursa (job #2531582) | Cod sursa (job #305443) | Istoria paginii runda/preoji_bv_11-12 | oni_2016_10-ziua2 | Cod sursa (job #2714923)
#include <bits/stdc++.h>
using namespace std;
ifstream in ("distante.in");
ofstream out ("distante.out");
int n, m, source;
int rasp_copil_prost[50001];
int rasp[50001];
int dist[50001];
bool viz[50001];
bool ok;
vector <pair <int, int> > v[50001];
void dijkstra (int start)
{
set <pair <int, int> > seti;
seti.insert({0, start});
dist[start] = 0;
while (!seti.empty())
{
int cost = (*seti.begin()).first;
int nod = (*seti.begin()).second;
seti.erase(seti.begin());
if (viz[nod])
continue;
if (dist[nod] != rasp_copil_prost[nod])
ok = 0;
viz[nod] = 1;
for (auto vecin: v[nod])
{
int to = vecin.first;
int cost_to = vecin.second;
if (!viz[to])
seti.insert({cost + cost_to, to});
dist[to] = min (dist[to], cost + cost_to);
}
}
}
void solve ()
{
in >> n >> m >> source;
for (int i = 1;i<=n;++i)
{
in >> rasp_copil_prost[i];
viz[i] = 0;
dist[i] = 1<<30;
v[i].clear();
}
for (int i = 1;i<=m;++i)
{
int a, b, c;
in >> a >> b >> c;
v[a].push_back({b,c});
v[b].push_back({a,c});
}
ok = 1;
dijkstra(source);
if (ok == 1)
out << "DA\n";
else
out << "NU\n";
}
int main ()
{
int t;
in >> t;
while (t--)
solve();
}