Pagini recente » Cod sursa (job #1358506) | Cod sursa (job #2311443) | Cod sursa (job #3192096) | Cod sursa (job #630687) | Cod sursa (job #2654059)
#include <cstdio>
#include <vector>
#include <algorithm>
#include <deque>
#define INF 2000000000
using namespace std;
int drez[50001],sol[50001],f[50001];
deque <int> nod;
vector <pair <int,int> > v[50001];
int main()
{
FILE *fin=fopen ("distante.in","r");
FILE *fout=fopen ("distante.out","w");
int n,m,i,vecin,x,y,z,p,cost,t,nc;
fscanf (fin,"%d",&t);
for (;t;t--){
fscanf (fin,"%d%d%d",&n,&m,&p);
for (i=1;i<=n;i++){
fscanf (fin,"%d",&drez[i]);
sol[i]=INF;
v[i].clear();
}
for (i=1;i<=m;i++){
fscanf (fin,"%d%d%d",&x,&y,&z);
v[x].push_back(make_pair (y,z));
v[y].push_back(make_pair (x,z));
}
f[p]=1;
nod.push_back(p);
sol[p]=0;
while (nod.size()!=0){
nc=*nod.begin();
f[nc]=0;
nod.pop_front();
for (vector <pair <int,int> > :: iterator it=v[nc].begin(); it != v[nc].end(); it++){
vecin=it->first;
cost=it->second;
if (sol[nc]+cost<sol[vecin]){
sol[vecin]=sol[nc]+cost;
if (f[vecin]==0){
f[vecin]=1;
nod.push_back(vecin);
}
}
}
}
for (i=1;i<=n;i++)
if (sol[i]!=drez[i])
break;
if (i<=n)
fprintf (fout,"NU\n");
else fprintf (fout,"DA\n");
}
return 0;
}