Cod sursa(job #1035851)

Utilizator alexpascadiAlexandru Pascadi alexpascadi Data 18 noiembrie 2013 20:32:11
Problema Distante Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <stdio.h>

using namespace std;

const int N=50001;
const int M=100001;
const int INF=1000000000;
const int NIL=-1;

struct nod
{
    int val;
    int urm;
    int cost;
};

nod a[2*M];
int q[N],list[N],sum[N],sum1[N],nr,p,u,n,m,t,s;
bool inq[N];

int main()
{
    FILE *in,*out;
    in=fopen("distante.in","r");
    out=fopen("distante.out","w");
    int i,j,x,y,poz,c;
    bool corect;
    fscanf(in,"%d",&t);
    for(j=1;j<=t;j++)
    {
        fscanf(in,"%d%d%d",&n,&m,&s);
        for(i=1;i<=n;i++) fscanf(in,"%d",&sum1[i]);
        nr=0;
        for(i=1;i<=n;i++) {list[i]=NIL; sum[i]=INF; inq[i]=0;}
        for(i=1;i<=m;i++)
        {
            fscanf(in,"%d%d%d",&x,&y,&c);
            a[nr].val=y;
            a[nr].urm=list[x];
            list[x]=nr;
            a[nr].cost=c;
            nr++;
            a[nr].val=x;
            a[nr].urm=list[y];
            list[y]=nr;
            a[nr].cost=c;
            nr++;
        }
        q[0]=s;
        inq[s]=1;
        sum[s] = 0;
        p=0; u=1;
        while(p!=u)
        {
            x=q[p];
            inq[x]=0;
            p=(p+1)%n;
            poz=list[x];
            while(poz!=NIL)
            {
                y=a[poz].val;
                if(sum[x] + a[poz].cost < sum[y])
                {
                    sum[y] = sum[x] + a[poz].cost;
                    if(inq[y]==0)
                    {
                        inq[y]=1;
                        q[u]=y;
                        u=(u+1)%n;
                    }
                }
                poz=a[poz].urm;
            }
        }
        corect=1;
        for(i=1;i<=n;i++)
        {
            //fprintf(out,"%d ",sum[i]);
            if(sum[i]!=sum1[i]) corect=0;
        }
        //fprintf(out,"\n");
        if(corect) fprintf(out,"DA\n");
        else fprintf(out,"NU\n");
    }
    return 0;
}