Cod sursa(job #200222)

Utilizator nusmaibunkeleviprofesor cicalescu nusmaibunkelevi Data 22 iulie 2008 19:13:48
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include<stdio.h>
#include<stdlib.h>

#define NMAX 60000
#define MMAX 150000

struct muchie{int a,b,c;};

muchie v[MMAX+MMAX+1];
int pv[NMAX+1];

void poz(int li,int ls,int&piv,muchie e[]){
int i=li,j=ls,d=0;
muchie t;
while(i<j){
	if(e[i].a>e[j].a){
		t=e[i];e[i]=e[j];e[j]=t;d=1-d;
		}
	i+=d;j-=1-d;
	}
piv=i;
}
void qsrt(int st,int dr,muchie e[]){
int piv;
if(st<dr){
	poz(st,dr,piv,e);
	qsrt(st,piv-1,e);
	qsrt(piv+1,dr,e);
	}
}

int main(){
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
int n,m,m2,i,j,t,nrt;
int o[NMAX+1]={0};
int ok,este[NMAX+1],sum,min,max;
char sir1[5*NMAX+10],sir[31],*p;
int x,y,z,start,pz;
scanf("%d",&t);
for(nrt=0;nrt<t;++nrt){
	scanf("%d%d%d\n",&n,&m,&start);
	m2=m+m;
	fgets(sir1,5*NMAX,stdin);
	p=sir1;
	for(i=1;i<=n;++i){
		o[i]=atoi(p);
		while(*p!=32)++p;++p;
		}
	for(i=1;i<=m;++i){
		fgets(sir,30,stdin);p=sir;
		x=atoi(p);
		while(*p!=32)++p;++p;
		y=atoi(p);
		while(*p!=32)++p;++p;
		z=atoi(p);
		v[i].a=x,v[i].b=y,v[i].c=z;
		v[i+m].a=y,v[i+m].b=x,v[i+m].c=z;
		}

	ok=1;
	for(i=1;i<=m&&ok;++i){
		x=v[i].a;y=v[i].b;
		if(x>n||y>n) {ok=0;break;}
		if(o[x]<=o[y]) min=o[x],max=o[y];
		else min=o[y],max=o[x];
		sum=min+v[i].c;
		ok=sum>=max;
		}
	if(!ok) goto finish;
	qsrt(1,m2,v);
	for(i=1;i<=n;++i) {pv[i]=0;este[i]=0;}
	for(i=1;i<=m2;++i){
		pz=v[i].a;
		if(!pv[pz]) pv[pz]=i;
		}

	//ok=1;
	este[start]=1;
	for(i=1;i<=n&&ok;++i){
		if(i==start) ok=o[i]==0;
		else{
			if(pv[i]){
				for(j=pv[i];j<=m2&&v[j].a==i&&ok;++j)
					if(o[i]==v[j].c+o[v[j].b])
						{este[i]=1;break;}
				if(!este[i]) ok=0;
				}
			else ok=0;
			}
		}
	finish:
	ok?printf("DA\n"):printf("NU\n");
	}
return 0;
}