Cod sursa(job #1484505)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 11 septembrie 2015 12:52:23
Problema Distante Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 0.97 kb
#include<stdio.h>
#include<stdlib.h>
int t,i,a[100001],b[100001],c[100001],n,m,s,l,d[50001],f[50001],*g[100001],*h[100001],w[50001],j;
int main() {
	freopen("distante1.txt","r",stdin),freopen("distante2.txt","w",stdout),scanf("%d",&t);
	while(t--) {
        scanf("%d%d%d",&n,&m,&s);
      	for(i=1;i<=n;i++)
            scanf("%d",d+i),w[i]=f[i]=0;
      	for(i=1;i<=m;i++)
            scanf("%d%d%d",&a[i],&b[i],&c[i]),w[a[i]]++,w[b[i]]++;
        for(i=1;i<=n;w[i++]=0) {
            g[i]=(int*)malloc(w[i]*sizeof(int));
            h[i]=(int*)malloc(w[i]*sizeof(int));
        }
        for(i=1;i<=m;i++)
            g[a[i]][w[a[i]]]=b[i],g[b[i]][w[b[i]]]=a[i],h[a[i]][w[a[i]]++]=h[b[i]][w[b[i]]++]=c[i];
      	l=0,f[s]=!d[s]?1:f[s];
      	for(i=1;i<=n;i++)
      	for(j=0;j<w[i];j++)
      	if(g[i][j]!=s&&d[g[i][j]]==h[i][j]+d[i])
            f[g[i][j]]=1;
      	for(i=1;i<=n;i++)
      	if(!f[i])
            l=1;
        printf("%s\n",!l?"DA":"NU");
	}
}