Pagini recente » Cod sursa (job #1341810) | PreOJI2014_0 | Cod sursa (job #378222) | Cod sursa (job #218053) | Cod sursa (job #315173)
Cod sursa(job #315173)
#include<algorithm>
using namespace std;
//#include<stdio.h>
#define DIM 1<<16
#define INF 1<<30
//#define DIM 501
//#define INF 1001
struct djk{
int poz,val;};
struct graf{
int nod,cost;
graf *urm;};
int t,n,m,s,cnt,b[DIM],h[DIM];
djk a[DIM];
graf *lst[DIM];
int check(){
int i;
for(i=1; i<=n; ++i)
if(a[i].val!=b[i])
return 0;
return 1;}
void add(int x,int y,int cost){
graf *p=new graf;
p->nod=y;
p->cost=cost;
p->urm=lst[x];
lst[x]=p;}
void init(){
int i;
graf *p,*q;
for(i=1; i<=n; ++i){
for(p=lst[i]; p; p=q){
q=p->urm;
delete p;}
lst[i]=NULL;
a[i].poz=a[i].val=0;}}
void swap(int x,int y){
int aux;
aux=h[x];
h[x]=h[y];
h[y]=aux;}
void uph(int k){
int aux;
while(k>1){
aux=k>>1;
if(a[h[aux]].val>a[h[k]].val){
a[h[k]].poz=aux;
a[h[aux]].poz=k;
swap(k,aux);
k=aux;}
else
return;}}
void downh(int k){
int aux;
while(k<=cnt){
if(k<<1<=cnt){
aux=k<<1;
if(aux+1<=cnt&&a[h[aux+1]].val<a[h[aux]].val)
++aux;}
else
return;
if(a[h[aux]].val<a[h[k]].val){
a[h[k]].poz=aux;
a[h[aux]].poz=k;
swap(k,aux);
k=aux;}
else
return;}}
void insert(int k){
h[++cnt]=k;
a[h[cnt]].poz=cnt;
uph(cnt);}
void cut(){
h[1]=h[cnt--];
a[h[1]].poz=1;
downh(1);}
void dijkstra(){
int aux;
graf *p;
h[++cnt]=s;
a[h[cnt]].poz=1;
while(cnt){
aux=h[1];
cut();
for(p=lst[aux]; p; p=p->urm)
if(a[aux].val+p->cost<a[p->nod].val){
a[p->nod].val=a[aux].val+p->cost;
if(a[p->nod].poz)
uph(a[p->nod].poz);
else
insert(p->nod);}}}
void solve(){
int i;
cnt=0;
for(i=1; i<=n; ++i)
if(i!=s)
a[i].val=INF;
dijkstra();
for(i=1; i<=n; ++i)
if(a[i].val==INF)
a[i].val=0;
if(check())
printf("DA\n");
else
printf("NU\n");}
void read(){
int i,j,x,y,cost;
scanf("%d",&t);
for(i=0; i<t; ++i){
scanf("%d%d%d",&n,&m,&s);
for(j=1; j<=n; ++j)
scanf("%d",&b[j]);
for(j=0; j<m; ++j){
scanf("%d%d%d",&x,&y,&cost);
add(x,y,cost);}
solve();
init();}}
int main(){
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
read();
return 0;}