Pagini recente » Cod sursa (job #2939069) | Cod sursa (job #1916077) | Cod sursa (job #1178087) | Cod sursa (job #2276075) | Cod sursa (job #2485312)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define NMAX 50005
using namespace std;
struct Servus{
int nod,cost;
bool operator <(const Servus&a)const{
return cost>a.cost;
}
};
ifstream in("distante.in");
ofstream out("distante.out");
vector<Servus> v[NMAX];
priority_queue<Servus> q;
int n,m,s,t;
int dist[NMAX],vec[NMAX];
void dickstra(int nod)
{
memset(dist,0x3f3f3f3f,sizeof dist);
dist[nod]=0;
q.push({nod,0});
while(!q.empty()){
int fata=q.top().nod;
q.pop();
for(auto i:v[fata]){
if(dist[fata]+i.cost<dist[i.nod]){
dist[i.nod]=dist[fata]+i.cost;
q.push({i.nod,dist[i.nod]});
}
}
}
}
int main()
{
int x,y,z;
int ok=0;
in>>t;
for(int i=1;i<=t;++i){
ok=0;
for(int j=1;j<=n;j++)
v[j].clear();
in>>n>>m>>s;
for(int j=1;j<=n;++j)
in>>vec[j];
for(int j=1;j<=m;++j){
in>>x>>y>>z;
v[x].push_back({y,z});
v[y].push_back({x,z});
}
dickstra(s);
for(int j=1;j<=n;++j)
if(vec[j]!=dist[j])
ok=1;
if(ok==0)
out<<"DA"<<'\n';
else
out<<"NU"<<'\n';
}
return 0;
}