Cod sursa(job #883312)

Utilizator iuli1505Parasca Iuliana iuli1505 Data 19 februarie 2013 21:54:43
Problema Distante Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include<cstdio>
#include<vector>
#include<deque>
#include<bitset>
#include<utility>
#define nmax 50010
#define oo 1<<30
using namespace std;
vector<pair<int,int> >v[nmax];
vector<pair<int,int> >::iterator it;
deque<int>Q;
bitset<nmax>M;
int n,m,s,t,ok,OK,x,y,c,d[nmax],dd[nmax],i;
int main()
{
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    scanf("%d ", &t);
    for(;t;--t)
    {
        if(ok)
            for(i=1;i<=n;i++)
                v[i].resize(0);
        scanf("%d%d%d", &n, &m, &s);
        ok=1;OK=1;
        for(i=1;i<=n;i++){scanf("%d ", &dd[i]);d[i]=oo;M[i]=0;}
        d[s]=0;M[s]=1;Q.push_back(s);
        for(;m;--m)
        {
            scanf("%d%d%d", &x, &y, &c);
            v[x].push_back(make_pair(y,c));
            v[y].push_back(make_pair(x,c));
        }
        if(dd[s]){printf("NU\n");continue;}
        for(;Q.size();)
        {
            x=Q.front();
            for(it=v[x].begin();it!=v[x].end();it++)
                if(d[it->first]>d[x]+it->second)
                {
                    d[it->first]=d[x]+it->second;
                    if(!M[it->first])
                    {
                        M[it->first]=1;
                        Q.push_back(it->first);
                    }
                }
            M[x]=0;
            Q.pop_front();

        }
        for(i=1;i<=n;i++)
            if(d[i]!=dd[i]){printf("NU\n");OK=0;break;}
        if(OK)printf("DA\n");

    }
    return 0;
}