Pagini recente » Diferente pentru arbori-de-intervale intre reviziile 49 si 12 | Cod sursa (job #1762388) | Cod sursa (job #2128621) | Cod sursa (job #2246114) | Cod sursa (job #2040999)
#include <fstream>
#include <cstring>
#include <vector>
#include <queue>
#define MAX 50005
#define INF 100000000
using namespace std;
ifstream fi("distante.in");
ofstream fo("distante.out");
int t;
int good[MAX],dist[MAX];
bool viz[MAX];
vector <pair<int,int>> G[MAX];
int main()
{
fi>>t;
while (t--)
{
int n,m,s;
fi>>n>>m>>s;
for (int i=1; i<=n; i++)
fi>>good[i];
for (int i=1; i<=n; i++)
G[i].clear();
for (int i=1; i<=m; i++)
{
int u,v,c;
fi>>u>>v>>c;
G[u].push_back({v,c});
G[v].push_back({u,c});
}
for (int i=1; i<=n; i++)
dist[i]=INF;
dist[s]=0;
memset(viz,0,sizeof(viz));
priority_queue <pair<int,int>> Q;
Q.push({0,s});
while (!Q.empty())
{
int nod=Q.top().second;
Q.pop();
if (viz[nod])
continue;
viz[nod]=1;
for (auto vecin: G[nod])
if (dist[nod]+vecin.second<dist[vecin.first])
{
dist[vecin.first]=dist[nod]+vecin.second;
Q.push({-dist[vecin.first],vecin.first});
}
}
bool ok=1;
for (int i=1; i<=n; i++)
if (dist[i]!=good[i])
{ok=0; break;}
if (ok)
fo<<"DA\n";
else
fo<<"NU\n";
}
return 0;
}