Cod sursa(job #275499)

Utilizator za_wolfpalianos cristian za_wolf Data 10 martie 2009 15:09:51
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include<stdio.h>
#include<vector>
#include<queue>
#define inf 100000000
#define NMAX 50001
using namespace std;
vector <int> x[11][NMAX],y[11][NMAX];
queue <int> q;
int w,nod,z[NMAX],i,j,n,m,k,l,a,s,b,c,t,tt,ss[NMAX],d[NMAX];
int main()
{
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    scanf("%d",&t);
    for (tt=1;tt<=t;tt++)
    {
        scanf("%d%d%d",&n,&m,&k);
        for (i=1;i<=n;i++)
            scanf("%d",&ss[i]);
        for (i=1;i<=m;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            x[tt][a].push_back(c);
            x[tt][b].push_back(c);
            y[tt][a].push_back(b);
            y[tt][b].push_back(a);
        }
        for (i=1;i<=n;i++)
            d[i]=inf;
        d[k]=0;
        q.push(k);
        z[k]=1;
        while (!q.empty())
        {
            nod=q.front();
            q.pop();
            w=(int)y[tt][nod].size();
            for (i=0;i<w;++i)
            {
                a=d[nod]+x[tt][nod][i];
                if (a<d[y[tt][nod][i]])
                {
                    d[y[tt][nod][i]]=a;
                    if (!z[y[tt][nod][i]])
                    {
                        q.push(y[tt][nod][i]);
                        z[y[tt][nod][i]]=1;
                    }
                }
            }



            z[nod]=0;
        }
        a=1;
        for (i=1;i<=n;i++)
            if (ss[i]!=d[i])
            {
                a=0;
                i=n+1;
            }
        if (a)
            printf("DA\n");
        else
            printf("NU\n");
        
    }


    return 0;
}