Cod sursa(job #1424162)

Utilizator DysKodeTurturica Razvan DysKode Data 23 aprilie 2015 17:32:31
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

#define INF 2000000000
#define DIM 50010
#define f first
#define s second

ifstream fin("distante.in");
ofstream fout("distante.out");

queue <int> Q;
vector < pair< int , int > > Edge[ DIM ];
int n,m,a,b,c,I,T,myAns[DIM],theirAns[DIM],curPoz,curSize,curAsc,curCost,z,i,ans;

int main()
{
    fin>>T;

    for( I = 1 ; I <= T ; ++I )
    {
        fin>>n>>m>>z;

        for( i = 1 ; i <= n ; ++i )
            myAns[ i ] = INF;
        myAns[ z ] = 0;

        for( i = 1 ; i <= n ; ++i )
            fin>>theirAns[ i ];

        for( i = 1 ; i <= m ; ++i )
        {
            fin>>a>>b>>c;
            Edge[ a ].push_back( make_pair( b , c ) );
        }

        Q.push( z );

        while( !Q.empty() )
        {
            curPoz = Q.front();
            curSize = Edge[ curPoz ].size();

            for( i = 0 ; i < curSize ; ++i )
            {
                curAsc = Edge[ curPoz ][ i ].f;
                curCost = Edge[ curPoz ][ i ].s;
                if( myAns[ curAsc ] > myAns[ curPoz ] + curCost )
                {
                    Q.push( curAsc );
                    myAns[ curAsc ] = myAns[ curPoz ] + curCost;
                }
            }

            Q.pop();
        }


        ans = 1;
        for( i = 1 ; i <= n ; ++i )
            if( myAns[ i ] != theirAns[ i ] )
            {
                ans = 0;
                break;
            }

        if( ans == 1 )
            fout<<"DA\n";
        else
            fout<<"NU\n";

        for( i = 1 ; i <= n ; ++i)
        {
            Edge[ i ].erase( Edge[ i ].begin() , Edge[ i ].end() );
        }

    }

return 0;
}