Pagini recente » Cod sursa (job #2757042) | Cod sursa (job #1072940) | Cod sursa (job #1315360) | Cod sursa (job #1257366) | Cod sursa (job #1917232)
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int vl[50002];
int evl[50002];
int nrnd[50002];
int hp[100002];
int inf=1<<30;
struct ad{
int nda,val;
};
int lhp=0;
vector<ad>g[50002];
int extract(){
int ex=hp[1],aux,i=1;
hp[i]=hp[lhp];
nrnd[hp[i]]=i;
lhp--;
while((i<<1<=lhp&&vl[hp[i]]>vl[hp[i<<1]])||((i<<1)+1<=lhp&&vl[hp[i]]>vl[hp[i<<1]])){
if(vl[hp[i]]>vl[hp[i<<1]]&&(vl[hp[i<<1]]<vl[hp[(i<<1)+1]]||(i<<1)+1>lhp)){
aux=hp[i];
hp[i]=hp[i<<1];
hp[i<<1]=aux;
nrnd[hp[i<<1]]=i<<1;
nrnd[hp[i]]=i;
}
else{
aux=hp[i];
hp[i]=hp[(i<<1)+1];
hp[(i<<1)+1]=aux;
nrnd[hp[(i<<1)+1]]=(i<<1)+1;
nrnd[hp[i]]=i;
}
}
nrnd[ex]=0;
return ex;
}
void insertheap(int elem){
++lhp;
hp[lhp]=elem;
nrnd[elem]=lhp;
int n=lhp,aux;
while(n>1){
if(vl[hp[n]]<vl[hp[n>>1]]){
aux=hp[n];
hp[n]=hp[n>>1];
hp[n>>1]=aux;
nrnd[hp[n]]=n;
nrnd[hp[n>>1]]=n>>1;
}
n>>=1;
}
}
void updateheap(int n){
int aux;
while(n>1){
if(vl[hp[n]]<vl[hp[n>>1]]){
aux=hp[n];
hp[n]=hp[n>>1];
hp[n>>1]=aux;
nrnd[hp[n]]=n;
nrnd[hp[n>>1]]=n>>1;
}
n>>=1;
}
}
int main(){
int n,m,i,a,b,c,t,tc,s;
bool ok;
ad aux;
int nod;
fin>>t;
for(tc=1;tc<=t;tc++){
fin>>n>>m>>s;
for(i=1;i<=n;i++)
fin>>evl[i];
for(i=1;i<=n;i++)
vl[i]=inf;
vl[s]=0;
for(i=1;i<=n;i++)
g[i].clear();
for(i=1;i<=m;i++){
fin>>a>>b>>c;
aux.nda=b;
aux.val=c;
g[a].push_back(aux);
}
insertheap(s);
while(lhp){
nod=extract();
i=0;
for(i=0;i<g[nod].size();i++)
if(g[nod][i].val+vl[nod]<vl[g[nod][i].nda]){
vl[g[nod][i].nda]=g[nod][i].val+vl[nod];
if(nrnd[g[nod][i].nda])updateheap(nrnd[g[nod][i].nda]);
else insertheap(g[nod][i].nda);
}
}
ok=true;
for(i=1;i<=n;i++)
if(evl[i]!=vl[i]){ok=false;break;}
if(ok)fout<<"DA"<<'\n';
else fout<<"NU"<<'\n';
}
fin.close();
fout.close();
return 0;
}