Cod sursa(job #2087606)

Utilizator pionierul22aNa LiZa pionierul22 Data 13 decembrie 2017 21:17:10
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <fstream>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int d[50001],s[50001],t[50001],a[20999][20999],n;

void infinit()
{
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            a[i][j]=50001;
            s[i]=0;
        }
}

void dijkstra(int r)
{
    s[r]=1;
    int infini=50001;
    for(int i=1;i<=n;i++)
    {
        d[i]=a[r][i];
        if(d[i]!=infini && s[i]==0)
            t[i]=r;
    }

    for(int i=1;i<=n-1;i++)
    {
        int minim=infini,poz;
        for(int j=1;j<=n;j++)
            if(s[j]==0)
            if(d[j]<minim)
        {
            minim=d[j];
            poz=j;
        }

        for(int j=1;j<=n;j++)
            if(s[j]==0)
            if(d[j]>d[poz]+a[poz][j])
        {
            d[j]=d[poz]+a[poz][j];
            t[j]=poz;
        }
    }
}

int main()
{
    int test;
    fin>>test;
    int g;
    for(g=1;g<=test;g++)
    {
        int m,nod;
        fin>>n>>m>>nod;
        int df[100];
        for(int i=1;i<=n;i++)
            fin>>df[i];

        infinit();
        for(int i=1;i<=m;i++)
        {
            int x,y,z;
            fin>>x>>y>>z;
            a[x][y]=z;
            a[i][i]=0;
        }
        dijkstra(nod);

        int ok=0;
        for(int i=1;i<=n;i++)
            if(d[i]!=df[i])
        {
            fout<<"NU"<<'\n';
            ok=1;
            break;
        }
        if(ok==0)
            fout<<"DA"<<'\n';

    }

    return 0;
}