Cod sursa(job #1142198)

Utilizator rzvrzvNicolescu Razvan rzvrzv Data 13 martie 2014 16:35:17
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>

using namespace std;

vector<pair<int,int> > grf[50002];
vector<pair<int,int> >::iterator it;
queue<int> q;
bool fol[50002],nrk;
int dmin[50002],j,i,t,n,m,pol,lgnrk[50002],a,b,c,crt;

int main()
{
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    scanf("%d",&t);
    for(i=1;i<=t;i++)
    {
        for(j=1;j<=n;j++)
        {
            grf[i].clear();
        }
        memset(dmin,0x3f3f3f3f,sizeof(dmin));
        scanf("%d%d%d",&n,&m,&pol);
        for(j=1;j<=n;j++)
        {
            scanf("%d",&lgnrk[j]);
        }
        for(j=1;j<=m;j++)
        {
            scanf("%d%d%d",&a,&b,&c);
            grf[a].push_back(make_pair(b,c));
        }
        memset(fol,false,sizeof(fol));
        q.push(pol);
        fol[pol]=true;
        dmin[pol]=0;
        while(q.size())
        {
            crt=q.front();
            fol[crt]=false;
            q.pop();
            for(it=grf[crt].begin();it!=grf[crt].end();it++)
            {
                if(dmin[crt]+it->second<dmin[it->first])
                {
                    dmin[it->first]=dmin[crt]+it->second;
                    q.push(it->first);
                    fol[it->first]=true;
                }
            }
        }
        nrk=true;
        for(j=1;j<=n;j++)
        {
            if(dmin[j]!=lgnrk[j])
            {
                nrk=false;
            }
        }
        if(nrk)
        {
            printf("DA\n");
        }
        else
        {
            printf("NU\n");
        }
    }
}