Cod sursa(job #1724947)

Utilizator radoneNeacsu Radu-Stefan radone Data 4 iulie 2016 16:47:04
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;

ifstream f("distante.in");
ofstream g("distante.out");

#define mult 500000000

int s, n, m, t, x, y, z;

int* dijkstra( vector<pair<int,int> > v[] )
{
    vector<pair<int,int> > h;
    h.push_back( make_pair( 0, s ) );

    int *dist;
    dist = new int[n+1];
    for( int i = 1; i <= n; i ++ )
        dist[i] = mult;
    dist[s] = 0;
    while( !h.empty() )
    {
        int nod;
        int distanta;
        nod = h.begin()->second;
        distanta = -h.begin()->first;

        pop_heap( h.begin(), h.end() );
        h.pop_back();

        for( vector<pair<int,int> >::iterator it = v[nod].begin(); it != v[nod].end(); it ++ )
            if( dist[ it->first ] > distanta + it->second )
            {
                dist[ it->first ] = distanta + it->second;
                h.push_back( make_pair( -dist[it->first], it->first ) );
                push_heap( h.begin(), h.end());
            }
    }

    return dist;
}

int verificare( int *d1, int *d2, int n )
{
    for( int i = 1; i <= n; i ++ )
        if( d1[i] != d2[i] )
            return 0;
    return 1;
}

int main()
{
    f >> t;

    for( int i = 0; i < t; i ++ )
    {
        f >> n >> m >> s;
        int *d, *d2;
        d = new int[n+1];
        vector<pair<int,int> > v[n+1];
        for( int j = 1; j <= n; j ++ )
            f >> d[j];
        for( int j = 0; j < m; j ++ )
        {
            f >> x >> y >> z;
            v[x].push_back( make_pair( y, z) );
            v[y].push_back( make_pair( x, z) );
        }
        d2 = dijkstra( v );
        if( verificare( d, d2, n ) )
            g << "DA\n";
        else
            g << "NU\n";
        delete[] d;
        delete[] d2;
    }
    return 0;
}