Pagini recente » Cod sursa (job #573445) | Cod sursa (job #1305226) | Cod sursa (job #164299) | Cod sursa (job #1749650) | Cod sursa (job #3120980)
#include <fstream>
#include <vector>
#include <set>
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
struct nod
{
vector <pair<int, int>> vec;
};
nod v[50005];
int di[50005];
int df[50005];
int n, m, sur, t;
multiset <pair<int, int>> s;
int main()
{
int INF = (1 << 30) - 1;
f>>t;
while(t--)
{
f>>n>>m>>sur;
for(int i = 1; i<=n; i++)
{
f>>di[i];
v[i].vec.clear();
}
int st, dr, c;
for(int i = 1; i<=m; i++)
{
f>>st>>dr>>c;
v[st].vec.push_back({dr, c});
v[dr].vec.push_back({st, c});
}
for(int i = 1; i<=n; i++)
{
if(i == sur)
{
df[i] = 0;
}
else
{
df[i] = INF;
}
}
s.insert({0, sur});
int nd, to, cost;
while(!s.empty())
{
nd = (*s.begin()).second;
s.erase(s.begin());
for(int i = 0; i<v[nd].vec.size(); i++)
{
to = v[nd].vec[i].first;
cost = v[nd].vec[i].second;
if(df[to] > df[nd] + cost)
{
if(df[to] != INF)
{
s.erase(s.find({df[to], to}));
}
df[to] = df[nd] + cost;
s.insert({df[to], to});
}
}
}
int ok = 1;
for(int i = 1; i<=n; i++)
{
if(di[i] != df[i])
{
ok = 0;
break;
}
}
if(ok == 1)
{
g<<"DA \n";
}
else
{
g<<"NU \n";
}
}
return 0;
}