Pagini recente » Borderou de evaluare (job #2957317) | Cod sursa (job #1436354) | Cod sursa (job #3154298)
#include <bits/stdc++.h>
#define nmx 50005
#define inf 2000000000
using namespace std;
int n,m,s,rs[nmx],mind[nmx];
struct edge
{
int dist;
int vert;
};
vector <edge> v[nmx];
bool operator < (const edge &a,const edge &b)
{
return a.dist<b.dist;
}
void dijk(int source)
{
for (int i=1; i<=n; i++)
mind[i]=inf;
priority_queue<edge> pq;
mind[source]=0;
pq.push({0,source});
while (!pq.empty())
{
auto u=pq.top();
pq.pop();
if (u.dist>mind[u.vert])
continue;
for (auto it : v[u.vert])
{
if (mind[u.vert]+it.dist<mind[it.vert])
{
mind[it.vert]=mind[u.vert]+it.dist;
pq.push({mind[it.vert],it.vert});
}
}
}
}
int t,a,b,c;
int main()
{
ifstream f ("distante.in");
ofstream g ("distante.out");
f>>t;
while (t--)
{
f>>n>>m>>s;
for (int i=1; i<=n; i++)
v[i].clear();
for (int i=1; i<=n; i++)
f>>rs[i];
for (int i=1; i<=m; i++)
{
f>>a>>b>>c;
v[a].push_back({c,b});
v[b].push_back({c,a});
}
dijk(s);
int ok=1;
for (int i=1; i<=n; i++)
if (mind[i]!=rs[i]) ok=0;
if (ok) g<<"DA"<<'\n';
else g<<"NU"<<'\n';
}
}