Cod sursa(job #329485)

Utilizator jupanubv92Popescu Marius jupanubv92 Data 6 iulie 2009 12:41:26
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
#include<stdio.h>
#include<string.h>
#define Nmx 50001
#define MOD (40*Nmx)
#define INF 230000001

int n,m,S,T ;
int query[Nmx],cost[Nmx];
int qu[MOD],viz[Nmx];
struct nod
{
    int x,c;
    nod *urm;
};
nod *G[Nmx];

void add(int x,int y,int c)
{
    nod *aux;
    aux=new nod;
    aux->x=y;
    aux->c=c;
    aux->urm=G[x];
    G[x]=aux;
}

void citire()
{
    char a[101];
    scanf("%d%d%d ",&n,&m,&S);
    for(int i=1;i<=n;++i)
        {
            scanf("%d ",&query[i]);
            cost[i]=INF;
        }
    for(int i=1;i<=m;++i)
        {
            fgets(a,101,stdin);
            int x=0,y=0,c=0,j=0;
            for(;a[j]>='0'&&a[j]<='9';++j)
                x=x*10+a[j]-'0';
            for(++j;a[j]>='0'&&a[j]<='9';++j)
                y=y*10+a[j]-'0';
            for(++j;a[j]>='0'&&a[j]<='9';++j)
                c=c*10+a[j]-'0';
            add(x,y,c);
            add(y,x,c);
        }
}

int dijkstra()
{
    if(query[S]!=0) return 0;
    int st,dr;
    st=dr=1;
    qu[1]=S;cost[S]=0;
    for(;st<=dr;++st)
    {
        viz[qu[st%MOD]]=0;
        for(nod *p=G[qu[st%MOD]];p;p=p->urm)
            if(cost[p->x]>cost[qu[st%MOD]]+p->c)
                {
                    cost[p->x]=cost[qu[st%MOD]]+p->c;
                    if(cost[p->x]<query[p->x]) return 0;
                    if(!viz[p->x])
                    {
                        ++dr;
                        qu[dr%MOD]=p->x;
                        viz[p->x]=1;
                    }
                }
    }
    for(int i=1;i<=n;i++)
        {if(cost[i]==INF)
          cost[i]=0;
        if(query[i]!=cost[i])
            return 0;
        }
    return 1;
}

int main()
{
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    scanf("%d",&T);
    for(;T;--T)
    {
        citire();
        if(dijkstra()) printf("DA\n");
            else printf("NU\n");
        memset(viz,0,sizeof(viz));
        memset(G,0,sizeof(G));
        memset(qu,0,sizeof(qu));
    }
    return 0;
}