Pagini recente » Cod sursa (job #85447) | Cod sursa (job #2540747) | Cod sursa (job #2480830) | Cod sursa (job #1299218) | Cod sursa (job #2038004)
#include <fstream>
#include <vector>
#include <set>
#define DIM 50002
#define INF 2000000
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
int T, t, nod, nodc, n, m, sursa, x, y, cost, sol[DIM], viz[DIM], d[DIM], ok;
set <pair<int, int> >s;
vector <pair<int, int> > graf[DIM];
int main()
{
f>>T;
for(int t = 1; t <= T; ++ t)
{
f>>n>>m>>sursa;
for(int i = 1; i <= n; ++ i)
f>>sol[i];
for(int i = 1; i <= m; ++ i)
{
f>>x>>y>>cost;
graf[x].push_back(make_pair(y, cost));
graf[y].push_back(make_pair(x, cost));
}
for(int i = 1; i <= n; ++ i)
d[i] = INF;
d[sursa] = 0;
s.insert(make_pair(0, sursa));
for(int i = 1; i <= n && !s.empty(); ++ i)
{
viz[nod] = 1;
nod = s.begin()->second;
s.erase(s.begin());
for(vector<pair<int, int> >::iterator it = graf[nod].begin(); it != graf[nod].end(); ++ it)
{
nodc = it->first;
cost = it->second;
if(d[nodc] > d[nod] + cost && viz[nodc] == 0)
{
s.erase(make_pair(d[nodc], nodc));
d[nodc] = d[nod] + cost;
s.insert(make_pair(d[nodc], nodc));
}
}
}
ok = 1;
for(int i = 1; i <= n; ++ i)
if(d[i] != sol[i])
ok = 0;
if(ok == 1)
g<<"DA"<<'\n';
else
g<<"NU"<<'\n';
for(int i = 1; i <= n; ++ i)
{
sol[i] = d[i] = viz[i] = 0;
graf[i].clear();
}
s.clear();
}
return 0;
}