Pagini recente » Cod sursa (job #130640) | Cod sursa (job #578759) | Cod sursa (job #2954939) | Cod sursa (job #1577635) | Cod sursa (job #2308918)
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#define MAX (1<<27)
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
int t, n, m, sursa, d_calc[50005], sol[50005], from, to, cost, dp[50005];
struct drum{
int nod;
int cost;
};
vector<drum>graph[50005];
bool operator<(drum a, drum b)
{
if (a.cost==b.cost)
return a.nod<b.nod;
return a.cost<b.cost;
}
set<drum>q;
void citire()
{
f >> n >> m >> sursa;
for (int i=1; i<=n; i++)
f >> d_calc[i], dp[i]=MAX;
for (int i=1; i<=m; i++)
{
f >> from >> to >> cost;
graph[from].push_back({to,cost});
graph[to].push_back({from,cost});
}
}
void afisare()
{
for (int i=1; i<=n; i++)
{
if (dp[i]!=d_calc[i])
{
g << "NU\n";
return;
}
}
g << "DA\n";
}
void rezolvare()
{
q.insert({sursa,0});
dp[sursa]=0;
while (!q.empty())
{
int nod = q.begin()->nod;
int cost = q.begin()->cost;
q.erase(q.begin());
for (auto &v:graph[nod])
{
if (dp[nod]+v.cost<dp[v.nod])
{
if (dp[v.nod]!=MAX)
q.erase({v.nod,dp[v.nod]});
dp[v.nod]=dp[nod]+v.cost;
q.insert({v.nod,dp[v.nod]});
}
}
}
afisare();
for (int i=1; i<=n; i++)
{
dp[i]=MAX;
graph[i].erase(graph[i].begin(),graph[i].end());
}
}
int main() {
f >> t;
for (int tes=1; tes<=t; tes++)
{
citire();
rezolvare();
}
return 0;
}