Pagini recente » Cod sursa (job #2403591) | Profil dornescuvlad | Cod sursa (job #1885993) | Cod sursa (job #1355804) | Cod sursa (job #2037829)
#include <fstream>
#include <vector>
#include <set>
#include <algorithm>
#define INF 2000000000
#define DIM_M 100002
#define DIM_N 50002
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
int T, viz[DIM_N], n, m, d[DIM_N], NOD, sol[DIM_N], x, y, cost, ok, nod;
class compare
{
public:
bool operator() (int a, int b)
{
return d[a] < d[b];
}
};
multiset <int, compare> s;
multiset <int, compare>::iterator it;
vector <pair<int, int> > graf[DIM_N];
int main()
{
f>>T;
for(int tt = 1; tt <= T; ++ tt)
{
f>>n>>m>>NOD;
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));
}
s.insert(NOD);
for(int i = 0; i <= n; ++ i)
d[i] = INF;
d[NOD] = 0;
for(int i = 1; i <= n; ++ i)
{
if(!s.empty())
{
nod = *s.begin();
viz[nod] = 1;
s.erase(s.begin());
}
for(int j = 0; j < graf[nod].size(); ++ j)
{
pair<int, int> nodc = graf[nod][j];
if(viz[nodc.first] == 0)
{
if(d[nodc.first] == INF)
{
d[nodc.first] = d[nod] + nodc.second;
s.insert(nodc.first);
}
else if(d[nod] + nodc.second < d[nodc.first])
{
if(!s.empty())
{
it = s.find(nodc.first);
s.erase(it);
}
d[nodc.first] = d[nod] + nodc.second;
s.insert(nodc.first);
}
}
}
}
ok = 1;
for(int i = 1; i <= n; ++ i)
if(sol[i] != d[i])
ok = 0;
if(ok == 1)
g<<"DA\n";
else
g<<"NU\n";
for(int i = 1; i <= n; ++ i)
{
graf[i].clear();
viz[i] = 0;
}
s.clear();
}
return 0;
}