Pagini recente » Cod sursa (job #1981710) | Cod sursa (job #572140) | Cod sursa (job #923981) | Cod sursa (job #1514329) | Cod sursa (job #1715128)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
#define NMAX 50000
#define INFINIT 0x3F3F3F3F
vector< pair<int, int> > ad[NMAX + 1];
vector<int> distante(NMAX + 1);
vector<int> distanteOriginale(NMAX + 1);
vector<bool> inCoada(NMAX + 1);
void aflaDistante(int nod);
bool cmp(int a, int b);
bool aceleasiValori(const vector<int> &v1, const vector<int> &v2, int n);
int main()
{
ifstream fin("distante.in");
ofstream fout("distante.out");
int t;
fin >> t;
while(t--){
int n, m, s;
fin >> n >> m >> s;
for(int i = 1; i <= n; ++i){
fin >> distanteOriginale[i];
distante[i] = INFINIT;
ad[i].clear();
}
while(m--){
int x, y, c;
fin >> x >> y >> c;
ad[x].push_back(make_pair(y, c));
ad[y].push_back(make_pair(x, c));
}
aflaDistante(s);
fout << ((aceleasiValori(distante, distanteOriginale, n)) ? "DA" : "NU") << "\n";
}
return 0;
}
bool aceleasiValori(const vector<int> &v1, const vector<int> &v2, int n){
for(int i = 1; i <= n; ++i)
if(v1[i] != v2[i])
return false;
return true;
}
void aflaDistante(int nod){
priority_queue<int, vector<int>, decltype(&cmp)> q(&cmp);
q.push(nod);
distante[nod] = 0;
while(!q.empty()){
nod = q.top();
q.pop();
inCoada[nod] = false;
for(auto legatura : ad[nod]){
int vecin = legatura.first;
int cost = legatura.second;
if(distante[vecin] > distante[nod] + cost){
distante[vecin] = distante[nod] + cost;
if(!inCoada[vecin]){
q.push(vecin);
inCoada[vecin] = true;
}
}
}
}
}
bool cmp(int a, int b){
return distante[a] > distante[b];
}