Pagini recente » Cod sursa (job #1142719) | Cod sursa (job #1690346) | Cod sursa (job #1515559) | Cod sursa (job #2685135) | Cod sursa (job #1603462)
#include<stdio.h>
#include<vector>
#include<queue>
using namespace std;
FILE *f1=fopen("distante.in","r");
FILE *f2=fopen("distante.out","w");
int n,m,t,s,verf[50001],d[50001];
class comp{
public:
bool operator() (const int&a,const int&b){
return d[a]>d[b];
}
};
priority_queue<int,vector<int>,comp>Q;
struct nod{
int inf,drum;
nod *urm;
}*L[50001];
void adaugaresf(int val,int cost,nod *&vf){
nod *q;
q=new nod;
q->inf=val;
q->drum=cost;
q->urm=vf;
vf=q;
}
void dijkstra(int r){
int x;
nod *q;
d[r]=0;
Q.push(r);
while(!Q.empty()){
x=Q.top();
Q.pop();
q=L[x];
while(q!=0){
if (d[q->inf]>d[x]+q->drum){
d[q->inf]=d[x]+q->drum;
Q.push(q->inf);
}
q=q->urm;
}
}
}
void rezolva(){
fscanf(f1,"%d%d%d",&n,&m,&s);
int i,j,k,a,b,c,sw=1;
for (i=1;i<=n;i++)
fscanf(f1,"%d",&verf[i]);
for (i=1;i<=n;i++)
L[i]=0;
for (k=1;k<=m;k++){
fscanf(f1,"%d%d%d",&a,&b,&c);
adaugaresf(a,c,L[b]);
adaugaresf(b,c,L[a]);
}
for (i=1;i<=n;i++)
d[i]=1000000;
dijkstra(s);
for (i=1;i<=n;i++)
if (d[i]!=verf[i]) {
sw=0;
break;
}
if (sw==1) fprintf(f2,"DA\n");
else
fprintf(f2,"NU\n");
}
int main(){
fscanf(f1,"%d",&t);
int i;
for (i=1;i<=t;i++){
rezolva();
}
fclose(f1);
fclose(f2);
return 0;
}