Pagini recente » Cod sursa (job #980080) | Cod sursa (job #2365861) | Cod sursa (job #2801157) | Cod sursa (job #127104) | Cod sursa (job #2450699)
#include <fstream>
#include <set>
#include <vector>
#define NMAX 50010
#define INF 1147483647
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
int n, T, ans[NMAX], start,dist[NMAX],m;
vector <pair <int,int > > v[NMAX];
int DJ(int start)
{
set < pair <int,int> > Q;
for(int i = 1; i <= n; ++i)
dist[i] = INF;
dist[start] = 0;
Q.insert({0,start});
while(!Q.empty())
{
int nod = (*Q.begin()).second;
Q.erase(Q.begin());
for(int i = 0; i < v[nod].size(); ++i)
{
int vf = v[nod][i].first;
int cost = v[nod][i].second;
if(dist[vf] > (dist[nod] + cost) )
{
if(dist[vf] != INF)
Q.erase(Q.find({dist[vf],vf}));
dist[vf] = dist[nod] + cost;
Q.insert({dist[vf],vf});
}
}
}
for(int i = 1; i <= n; ++i)
{
if(dist[i] == INF)
dist[i] = 0;
if(dist[i] != ans[i])
return 0;
}
return 1;
}
int main()
{
f >> T;
while(T--)
{
f >> n >> m >> start;
for(int i = 1; i <= n; ++i)
f >> ans[i];
for(int i = 1; i <= m; ++i)
{
int x, y, cost;
f >> x >> y >> cost;
v[x].push_back({y,cost});
v[y].push_back({x,cost});
}
if(DJ(start) == 1)
g << "DA\n";
else
g << "NU\n";
for(int i = 1; i <= m; ++i)
v[i].clear();
}
f.close();
g.close();
return 0;
}