Cod sursa(job #1120337)

Utilizator lianaliana tucar liana Data 24 februarie 2014 23:12:44
Problema Distante Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include<stdio.h>
#include<vector>
using namespace std;
#define nmax 50005
struct element{int n,c;};
int n, m, s, a, b, c, i, nrg, ii, t, inc, sf, x;
vector <element> ma[nmax];
vector <element> ::iterator it;
element el;
int dmin[nmax], co[nmax];
bool ex[nmax], ok;

void citire()
{
    scanf("%ld %ld %ld",&n,&m,&s);
    for (i=1;i<=n;i++)
    {
        scanf("%ld",&dmin[i]);
        ex[i]=0; ma[i].clear();
    }
    for(i=1;i<=m;i++)
    {
        scanf("%ld %ld %ld",&a,&b,&c);
        el.n=b; el.c=c;
        ma[a].push_back(el);
        el.n=a; el.c=c;
        ma[b].push_back(el);
    }
}

void rezolvare()
{
    ok=(dmin[s]==0);    nrg=0;
    inc=sf=1;
    co[1]=s;
    while (inc<=sf)
    {
        x=co[inc]; inc++;
        for (it=ma[x].begin();it!=ma[x].end();it++)
        {
            if ((dmin[(*it).n]==dmin[x]+(*it).c)&&(!ex[(*it).n]))
            {
                co[++sf]=(*it).n;
                ex[(*it).n]=1;
            }
            if ((dmin[(*it).n]>dmin[x]+(*it).c)&&(!ex[(*it).n]))
            {   ok=0;   inc=sf+5;   break;            }
        }
    }
    if ((ok)&&(sf==n))
        printf("DA\n");
    else
        printf("NU\n");

}
int main()
{
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    scanf("%ld",&t);
    for (ii=1;ii<=t;ii++)
    {
        citire();
        rezolvare();
    }
    return 0;
}