Cod sursa(job #963203)

Utilizator andreimaresuMaresu Andrei andreimaresu Data 16 iunie 2013 20:13:49
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <stdio.h>

#define INF 1000

int main()
{
    int t,c;
    int a,b,s,i,n,m,j,d[715],d1[715],vizitat[715];
    int dist[715][715];
    FILE *in=fopen("distante.in","r");
    FILE *out=fopen("distante.out","w");
    fscanf(in,"%d",&t);
    for(int i=0;i<t;i++)
    {
        fscanf(in,"%d %d %d",&n,&m,&s);
        for(int j=1;j<=n;j++)
        {
            fscanf(in,"%ld",&d1[j]);
            d[j]=INF;
            vizitat[j]=0;
        }

        for(int j=1;j<=n;j++)
        {
            for(int k=1;k<=n;k++)
            dist[j][k]=0;
        }

        for(int j=0;j<m;j++)
        {
            fscanf(in,"%d %d %d",&a,&b,&c);
            dist[a][b]=c;
        }

        d[s]=0;
        int small;

        for (int k = 1; k <= n; ++k)
        {
        small = -1;
        for (int l = 1; l <= n; ++l)
            if (!vizitat[l] && ((small == -1) || (d[l] < d[small])))
                small = l;

        vizitat[small] = 1;

        for (int l = 1; l <= n; ++l)
            if (dist[small][l])
                if (d[small] + dist[small][l] < d[l])
                    d[l] = d[small] + dist[small][l];
        }
        bool ok=true;
        for(int j=1;j<=n;j++)
        {
            if(d1[j]!=d[j])
            {
                ok=false;
                break;
            }
        }
        if(ok)
        {
            fprintf(out,"DA\n");
        }
        else
        {
            fprintf(out,"NU\n");
        }

    }
    fclose(in);
    fclose(out);
    return 0;
}