Pagini recente » Cod sursa (job #1093501) | Cod sursa (job #920378) | Cod sursa (job #2181022) | Cod sursa (job #2323062) | Cod sursa (job #2546349)
#include <bits/stdc++.h>
#define dim 50005
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
struct zaharel
{
int cost,node;
bool operator <(const zaharel & other) const
{
return cost>other.cost;
}
};
struct bronzarel
{
int cost,node;
};
priority_queue <zaharel> q;
vector <bronzarel> graph[dim];
int n,m,s,d[dim],dist[dim];
void Init()
{
for(int i=1; i<=n; ++i)
{
graph[i].clear();
}
}
void Read()
{
f>>n>>m>>s;
for(int i=1; i<=n; ++i)
f>>d[i];
for(int i=1; i<=m; ++i)
{
int x,y,c;
f>>x>>y>>c;
graph[x].push_back({c,y});
graph[y].push_back({c,x});
}
}
void Dijkstra()
{
for(int i=1; i<=n; ++i)
dist[i]=-1;
dist[s]=0;
q.push({0,s});
while(!q.empty())
{
int node=q.top().node;
int cost=q.top().cost;
q.pop();
if(cost!=dist[node])
continue;
for(int i=0; i<graph[node].size(); ++i)
{
int son=graph[node][i].node;
int costt=graph[node][i].cost;
if(dist[son]==-1||dist[son]>dist[node]+costt)
{
dist[son]=dist[node]+costt;
q.push({dist[son],son});
}
}
}
}
void Write()
{
for(int i=1; i<=n; ++i)
if(dist[i]!=d[i])
{
g<<"NU\n";
return;
}
g<<"DA\n";
}
int main()
{
int t;
f>>t;
for(int i=1; i<=t; ++i)
{
Init();
Read();
Dijkstra();
Write();
}
return 0;
}