Cod sursa(job #875167)

Utilizator gabriel93Robu Gabriel gabriel93 Data 9 februarie 2013 19:25:29
Problema Distante Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include<stdio.h>
#include<stack>
#define Nmax 50002
using namespace std;
int s,n,m,t;

struct graf
{
    int v,c;
    graf *adr;
};

graf *g[Nmax];
int d[Nmax];
stack<int> st;

void graf_add(int v1,int v2,int c)
{
    graf *p;
    p=new graf;
    p->v=v2;
    p->c=c;
    p->adr=g[v1];
    g[v1]=p;
}

void citire()
{
    int i,x,y,c;
    scanf("%d %d %d",&n,&m,&s);
    while(!st.empty())
        st.pop();
    for(i=1;i<=n;++i)
    {
        g[i]=0;
        scanf("%d",&d[i]);
    }
    for(i=1;i<=m;++i)
    {
        scanf("%d %d %d",&x,&y,&c);
        graf_add(x,y,c);
        graf_add(y,x,c);
    }
}

int check(int x)
{
    int k;
    graf *p;
    if(d[x]!=0)
        return 0;
    k=1;
    for(p=g[x];p;p=p->adr)
        if(d[p->v]==p->c)
        {
            ++k;
            st.push(p->v);
        }
    while(!st.empty() && k<n)
    {
        x=st.top();
        st.pop();
        for(p=g[x];p;p=p->adr)
            if(d[p->v]==d[x]+p->c)
            {
                st.push(p->v);
                ++k;
            }
    }
    if(k==n)
        return 1;
    return 0;
}

void rezolv()
{
    int i,ok;
    scanf("%d",&t);
    for(i=1;i<=t;++i)
    {
        citire();
        ok=check(s);
        if(ok==0)
            printf("NU\n");
        else
            printf("DA\n");
    }

}
int main()
{
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    rezolv();
    fclose(stdin);
    fclose(stdin);
    return 0;
}