Pagini recente » Cod sursa (job #1170823) | Cod sursa (job #315390) | Cod sursa (job #941929) | Cod sursa (job #1987106) | Cod sursa (job #2907391)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
priority_queue<pair<int, int>> coada;
vector <vector<pair <int, int>>> CosturiMuchii;
vector <int> distanta;
vector <bool> vizitat;
vector<int> Dijkstra(int x, int n){
distanta[x]=0;
coada.push(make_pair(0, x));
while(!coada.empty())
{
int NodCurent = coada.top().second;
coada.pop();
if(vizitat[NodCurent]==false)
{
vizitat[NodCurent]=true;
for(auto i : CosturiMuchii[NodCurent])
{
int vecin = i.first;
int cost = i.second;
if(distanta[NodCurent] + cost <distanta[vecin])
{
distanta[vecin] = distanta[NodCurent] + cost;
coada.push(make_pair(-distanta[vecin], vecin));
}
}
}
}
return distanta;
}
int main()
{
int t, n, m, a, b, c, x;
f>>t;
for(int i=0; i<t; i++){
f>>n>>m>>x;
vector <int> bronzarel(n+1, 0);
CosturiMuchii.resize(n+1);
distanta.resize(n+1, INT_MAX);
vizitat.resize(n+1, false);
bool verif = true;
for(int i=1; i<=n; i++){
f>>a;
bronzarel[i]=a;
}
for(int i=0; i<m; i++)
{
f>>a>>b>>c;
CosturiMuchii[a].push_back(make_pair(b,c));
}
vector<int> v = Dijkstra(x, n);
for(int i=1; i<=n; i++)
if(bronzarel[i]!=distanta[i])
verif = false;
if(verif)
g<<"DA"<<'\n';
else
g<<"NU"<<'\n';
bronzarel.clear();
vizitat.clear();
distanta.clear();
CosturiMuchii.clear();
v.clear();
}
}