Pagini recente » Cod sursa (job #3154313) | Cod sursa (job #2777617) | Cod sursa (job #1243224) | Cod sursa (job #1424932) | Cod sursa (job #3194645)
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
ifstream cin ("distante.in");
ofstream cout ("distante.out");
long long t,n,m,s,x,y,z;
struct el
{
int nod,cost;
bool operator < (const el &A) const{
return cost > A.cost;
}
};
priority_queue < el > q;
vector < el > v[500005];
long long distante[500005];
long long valori_distante[500005];
void Dijkstra(int s)
{
q.push({s,0});
while (!q.empty())
{
int valoare=q.top().cost;
int nod=q.top().nod;
for (int i=0;i<v[nod].size();i++)
{
el vecin=v[nod][i];
if ((distante[nod]+vecin.cost< distante[vecin.nod]) || (distante[vecin.nod]==0))
{
distante[vecin.nod]=distante[nod]+vecin.cost;
q.push({vecin.nod,distante[vecin.nod]});
}
}
q.pop();
}
}
int main()
{
cin >> t;
for (int i=1;i<=t;i++)
{
cin >> n >> m >> s;
for (int j=1;j<=n;j++)
{
cin >> valori_distante[j];
}
for (int j=1;j<=m;j++)
{
cin >> x >> y >> z;
v[x].push_back({y,z});
v[y].push_back({x,z});
}
Dijkstra(s);
///for (int j=1;j<=n;j++) cout << distante[j] << " ";
int j=1;
while ((distante[j]==valori_distante[j] && j<=n) || j==s) j++;
if (j==n+1) cout << "DA";
else cout << "NU";
cout << '\n';
for (int j=1;j<=n;j++)
{
v[j].clear();distante[j]=0;
}
}
return 0;
}