Cod sursa(job #2279819)

Utilizator ralfd123Amariei Andrei ralfd123 Data 10 noiembrie 2018 00:59:17
Problema Distante Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <fstream>
using namespace std;
ifstream f("distante.in"); ofstream g("distante.out");
int T,n,a[5010][5010],m,S,sol[50010];
int viz[50010],d[50010],mini,poz;
#define infinit 1010

void dijkstra(int x)
{   viz[x]=1;
    for(int i=1;i<=n;++i)
    {   d[i]=a[x][i];
        ///if( x != i ) if( d[i] < infinit ) tata[i]=x;
    }
    for(int i=1;i<=n-1;++i)
    {   mini=infinit;
        for(int j=1;j<=n;++j)
            if( viz[j] == 0 and d[j] < mini )
            {   mini=d[j]; poz=j;
            }
        viz[poz]=1;
        for(int j=1;j<=n;++j)
            if( viz[j] == 0 and d[j] > d[poz]+a[poz][j] )
            {   d[j]=d[poz]+a[poz][j];
                ///tata[j]=poz;
            }
    }
}

int verif(int a[50010],int b[50010],int n)
{   for(int i=1;i<=n;++i)
        if( a[i] != b[i] ) return 0;
    return 1;
}

void citire()
{   f>>T;
    while( T )
    {   f>>n>>m>>S;
        for(int i=1;i<=n;++i) f>>sol[i];

        int x1=0,y1=0,z1=0;

        for(int i=1;i<=n;++i)
            for(int j=1;j<=n;++j) if( i != j ) a[i][j]=infinit;

        while( m )
        {   f>>x1>>y1>>z1; a[x1][y1]=a[y1][x1]=z1;
            m--;
        }

        dijkstra(S);

        if( verif(sol,d,n) ) g<<"DA"<<'\n'; else g<<"NU"<<'\n';

        for(int i=1;i<=n;++i) {viz[i]=0; d[i]=0;}
        T--;
    }
}

int main()
{   citire();

g.close();
return 0;
}