Pagini recente » Cod sursa (job #1331125) | Cod sursa (job #880340) | Cod sursa (job #1585435) | Cod sursa (job #2892616) | Cod sursa (job #2347881)
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
#include <limits.h>
#include <cstring>
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
int t,n,m,source,d[50001],dist[50001],i,j,z,x,y,cost,vecin;
vector < pair <int,int> > a[50001];
struct comparaDistante {
bool operator()(int x,int y)
{
return dist[x]>dist[y];
}
};
priority_queue <int,vector<int>,comparaDistante> pq;
bitset <50001> viz;
void infinity()
{
for (int i=1;i<=n;++i)
dist[i]=INT_MAX;
}
int main()
{
in>>t;
for (i=1;i<=t;++i)
{
int ok=0;
in>>n>>m>>source;
for (j=1;j<=n;++j)
in>>d[j];
for (j=1;j<=m;++j)
{
in>>x>>y>>cost;
a[x].push_back(make_pair(y,cost));
a[y].push_back(make_pair(x,cost));
}
infinity();
dist[source]=0;
pq.push(source);
viz[source]=1;
while (!pq.empty())
{
x=pq.top();
viz[x]=0;
for (z=0;z<a[x].size();++z)
{
vecin=a[x][z].first;
cost=a[x][z].second;
if (dist[x]+cost<dist[vecin])
{
dist[vecin]=dist[x]+cost;
if (!viz[vecin])
{
viz[vecin]=1;
pq.push(vecin);
}
}
}
pq.pop();
}
for (z=1;z<=n;++z)
{
if (dist[z]!=d[z])
{
ok=1;
out<<"NU\n";
break;
}
}
if (!ok) out<<"DA\n";
viz.reset();
memset(a,0,sizeof a);
}
}