Cod sursa(job #1819371)

Utilizator Tiberiu02Tiberiu Musat Tiberiu02 Data 30 noiembrie 2016 15:53:24
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.66 kb
# include <cstdio>
# include <fstream>
# include <vector>
# include <queue>

using namespace std;

class ifbuffer {
    private:
        char text[100000];
        int size;
        int pos;
        bool isDigit[128];

        FILE *file;

        inline void refill( void ) {
            pos = 0;
            fread( text, 1, size, file );
        }

        inline char getc() {
            char c = text[pos ++];

            if ( pos == size )
                refill();

            return c;
        }

        inline int getnr() {
            char c = getc();
            int nr = 0, p;

            while ( !isDigit[c] && c != '-' )
                c = getc();
            if ( c == '-' ) {
                p = -1;
                c = getc();
            } else
                p = 1;
            while ( isDigit[c] ) {
                nr = nr * 10 + c - '0';
                c = getc();
            }

            return nr * p;
        }

    public:
        inline ifbuffer( char * path, int s = 100000 ) {
            size = s;

            file = fopen( path, "r" );

            int i;
            for ( i = 0; i < '0'; i ++ )
                isDigit[i] = false;
            for ( i = '0'; i <= '9'; i ++ )
                isDigit[i] = true;
            for ( i = '9' + 1; i < 128; i ++ )
                isDigit[i] = false;

            refill();
        }

        inline ifbuffer &operator>>( int &v ) {
            v = getnr();
            return *this;
        }

        inline ifbuffer &operator>>( char &v ) {
            v = getc();
            return *this;
        }

        inline void close() {
            fclose( file );
        }
};

class ofbuffer {
    private:
        char text[100000];
        int size;
        int pos;
        bool isDigit[128];

        FILE *file;

        inline void clear( void ) {
            pos = 0;
            fwrite( text, 1, size, file );
        }

        inline void putc( char c) {
            text[pos ++] = c;

            if ( pos == size )
                clear();
        }

        inline void putnr( int nr ) {
            if ( nr < 0 ) {
                putc( '-' );
                nr =- nr;
            }

            int p10;
            for ( p10 = 1; p10 * 10LL <= nr; p10 *= 10 );
            for ( ; p10 > 0; p10 /= 10 )
                putc( nr / p10 % 10 + '0' );
        }

    public:
        inline ofbuffer( char * path, int s = 100000 ) {
            size = s;

            file = fopen( path, "w" );

            int i;
            for ( i = 0; i < '0'; i ++ )
                isDigit[i] = false;
            for ( i = '0'; i <= '9'; i ++ )
                isDigit[i] = true;
            for ( i = '9' + 1; i < 128; i ++ )
                isDigit[i] = false;
        }

        inline ofbuffer &operator<<( int v ) {
            fprintf( file, "%d", v );
            return *this;
        }

        inline ofbuffer &operator<<( char v ) {
            fputc( v, file );
            return *this;
        }

        inline void close() {
            fclose( file );
        }
};

# define MAX_N 50000
int dist[1 + MAX_N];
bool check[1 + MAX_N];

# define undefined -1

struct path
{
    int dist, dest;

    path( int _dest, int _dist )
    {
        dest = _dest;
        dist = _dist;
    }
};

vector<path> v[MAX_N];

class cmp
{
public:
    bool operator()( path a, path b )
    {
        return a.dist > b.dist;
    }
};


int main()
{
    ifbuffer fin( "distante.in" );
    ofbuffer fout( "distante.out" );

    ios::sync_with_stdio( false );

    int t;

    fin >> t;

    for ( ; t > 0; t -- ) {
        int n, m, s, i, a, b, c;
        priority_queue<path, vector<path>, cmp> dix;
        bool r = true;

        fin >> n >> m >> s;

        for ( i = 1; i <= n; i ++ ) {
            v[i].clear();
            check[i] = false;
            fin >> dist[i];
        }

        for ( i = 0; i < m; i ++ ) {
            fin >> a >> b >> c;
            v[a].push_back( path( b, c ) );
            v[b].push_back( path( a, c ) );
        }

        dix.push( path( s, 0 ) );

        while ( dix.size() && r ) {
            path t = dix.top();
            dix.pop();

            if ( check[t.dest] )
                continue;

            if ( dist[t.dest] != t.dist )
                r = false;
            else {
                check[t.dest] = true;

                for ( path i : v[t.dest] )
                    dix.push( path( i.dest, i.dist + t.dist ) );
            }
        }

        for ( i = 1; i <= n; i ++ )
            if ( check[i] == false && dist[i] != 0 )
                r = 0;

        if ( r )
            fout << 'D' << 'A';
        else
            fout << 'N' << 'U';
        fout << '\n';
    }

    fin.close();
    fout.close();

    return 0;
}