Cod sursa(job #1367318)

Utilizator lau0097Cioclei Laurentiu lau0097 Data 1 martie 2015 19:40:08
Problema Distante Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <cstdio>
# define nmax 50002
# define mmax 100002
# define inf  20000000

using namespace std;



int n,m,t,s;
struct muchie {int x,y,c;};
muchie G[mmax];
int D[nmax],Dr[nmax];

int main()
{freopen("distante.in", "rt", stdin);
    freopen("distante.out", "wt", stdout);
    scanf("%d",&t);
int i,ok;
        while(t)
        {for(i=1;i<=n;++i) D[i]=0;
            ok=0;
        scanf("%d",&n);
        scanf("%d",&m);
        scanf("%d",&s);
        for(i=1;i<=n;++i) scanf("%d",&Dr[i]);
        for(i=1;i<=m;++i)
        {
           scanf("%d",&G[i].x);
           scanf("%d",&G[i].y);
           scanf("%d",&G[i].c);
            if(G[i].x==s) D[G[i].y]=G[i].c;

        }
        for(i=1;i<=n;++i)
        {
            if(D[i]==0 && i!=s) D[i]=inf;
        }
        while(ok==0)
        {
            ok=1;
            for(i=1;i<=m;++i)
           {
               if(D[G[i].y]>D[G[i].x]+G[i].c)
            {
                D[G[i].y]=D[G[i].x]+G[i].c;
                ok=0;
            }
                if(D[G[i].x]>D[G[i].y]+G[i].c)
            {
                D[G[i].x]=D[G[i].y]+G[i].c;
                ok=0;
            }
           }
        }

        ok=0;
        for(i=1;i<=n;++i)
        if(D[i]!=Dr[i]) {ok=1 ; i=n+1;}
        if(ok==0) printf("DA\n");
            else  printf("NU\n");



            --t;
        }

    return 0;
}