Pagini recente » Cod sursa (job #866527) | Cod sursa (job #1351595) | Cod sursa (job #2540708) | Cod sursa (job #2952509) | Cod sursa (job #2560297)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
const int NMAX = 50005;
const int INF = (int)1e18;
int T;
int D[NMAX];
struct Compara{
bool operator()(int x,int y)
{
return D[x]>D[y];
}
};
void Dijkstra(vector <pair <int,int> >X[],int NodStart,bool Viz[])
{
priority_queue <int, vector <int>, Compara>Q;
D[NodStart]=0;
Viz[NodStart]=1;
Q.push(NodStart);
while(!Q.empty()){
int Curent=Q.top();
Viz[Curent]=0;
Q.pop();
for(unsigned int i=0;i<X[Curent].size();i++){
int Vecin=X[Curent][i].first;
int Cost=X[Curent][i].second;
if(D[Vecin]>D[Curent]+Cost){
D[Vecin]=D[Curent]+Cost;
if(!Viz[Vecin]){
Viz[Vecin]=1;
Q.push(Vecin);
}
}
}
}
}
int main()
{
f>>T;
for(int test=1;test<=T;test++){
int N,M,NodStart;
f>>N>>M>>NodStart;
int Dist[NMAX];
for(int i=1;i<=N;i++){
f>>Dist[i];
}
vector <pair <int,int> >X[NMAX];
while(M){
int i,j,c;
f>>i>>j>>c;
X[i].push_back(make_pair(j,c));
X[j].push_back(make_pair(i,c));
M--;
}
bool Viz[NMAX];
for(int i=1;i<=N;i++){
D[i]=INF;
Viz[i]=0;
}
bool Ok=1;
Dijkstra(X,NodStart,Viz);
for(int i=1;i<=N;i++){
if(Dist[i]!=D[i]){
Ok=0;
i=N;
}
}
if(Ok){
g<<"DA"<<'\n';
}else{
g<<"NU"<<'\n';
}
}
f.close();
g.close();
return 0;
}