Pagini recente » Cod sursa (job #2691995) | Cod sursa (job #2652612) | Cod sursa (job #567823) | Cod sursa (job #2310401) | Cod sursa (job #2888310)
#include <bits/stdc++.h>
using namespace std;
string fisier = "distante";
ifstream fin(fisier+".in");
ofstream fout(fisier+".out");
const int CMAX = 5e4+15;
const int oo = 2147483647;
int n , m , start , x , y , c;
int nr_graf;
int D[CMAX];
bool viz[CMAX];
int distante[CMAX];
vector < pair < int , int > > graf[CMAX];
struct cmp{
bool operator()(int x, int y){
return D[x] > D[y];
}
};
priority_queue < int , vector < int > , cmp > Q;
void dijkstra(vector < pair < int , int > > graf[], int start)
{
D[start] = 0;
viz[start] = 1;
Q.push(start);
while(!Q.empty()){
int nod_curent = Q.top();
Q.pop();
viz[nod_curent] = 0;
for(int i=0;i<graf[nod_curent].size();i++){
int vecin = graf[nod_curent][i].first;
int cost = graf[nod_curent][i].second;
if(D[nod_curent]+cost<D[vecin]){
D[vecin] = D[nod_curent] + cost;
if(viz[vecin]==0)
{
viz[vecin] = 1;
Q.push(vecin);
}
}
}
}
}
bool comparare(int D[], int distante[]){
for(int i=1;i<=n;i++)
if(D[i]!=distante[i])
return false;
return true;
}
int main()
{
fin >> nr_graf;
for(int temp=1;temp<=nr_graf;temp++){
fin >> n >> m >> start;
for(int j=1;j<=n;j++){
fin >> distante[j];
D[j] = oo;
viz[j] = 0;
graf[j].clear();
}
for(int j=1;j<=m;j++)
{
fin >> x >> y >> c;
graf[x].push_back({y,c});
graf[y].push_back({x,c});
}
dijkstra(graf,start);
/*
cout << "vectorul de distante dijkstra: " << '\n';
for(int j=1;j<=n;j++)
cout << D[j] << " ";
cout << '\n';
cout << "vectorul de distante citit" << '\n';
for(int j=1;j<=n;j++)
cout << distante[j] << " ";
cout << '\n';
*/
if(comparare(D,distante)==false)
fout << "NU" << '\n';
else
fout << "DA" << '\n';
}
return 0;
}