Cod sursa(job #1632448)

Utilizator georgeliviuPereteanu George georgeliviu Data 6 martie 2016 10:00:18
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <cstdio>
#include <string.h>
#include <vector>
#include <queue>

using namespace std;

#define Nmax 50010
#define inf 0x3f3f3f3f
queue <int> Q ;
vector <pair<int,int> > ad[Nmax] ;
int D[Nmax] ;
bool viz[Nmax] ;
int n , m , s , start , a , b , c , t ;
int v[Nmax] ;

void Dijkstra ( int start )
{
    memset( D , inf , sizeof(D) ) ;
    memset( viz , false , sizeof(viz) ) ;
    D[1] = 0 ;
    viz[1] = true ;
    Q.push(s) ;
    while ( !Q.empty() )
    {
        int nod = Q.front();
        Q.pop();
        viz[nod] = false ;
        for ( int i = 0 ; i < ad[nod].size() ; i++ )
        {
            if ( D[nod] + ad[nod][i].second < D[ad[nod][i].first] )
            {
                D[ad[nod][i].first] = D[nod] + ad[nod][i].second ;
                if ( !viz[ad[nod][i].first] )
                {
                    Q.push(ad[nod][i].first);
                    viz[ad[nod][i].first] = true ;
                }
            }
        }
    }
}

int main()
{
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);

    scanf("%d",&t);
    for ( int i = 1 ; i <= t ; i++ )
    {
        scanf("%d %d %d",&n,&m,&s);
        for ( int j = 1 ; j <= n ; j++ )
        {
            scanf("%d ",&v[j]);
        }
        for ( int q = 1 ; q <= m ; q++ )
        {
            scanf("%d %d %d",&a,&b,&c);
            ad[a].push_back(make_pair(b,c));
            ad[b].push_back(make_pair(a,c));
        }
        Dijkstra(s) ;
        bool a_intrat = false ;
        for ( int k = 1 ; k <= n ; k++ )
        {
                if ( D[k] == inf ) D[k] = 0 ;
                if ( D[k] != v[k] ) a_intrat = true ;
        }
        if ( a_intrat == true ) printf("NU\n");
        else printf("DA\n");
    }
}