Cod sursa(job #1626342)

Utilizator gerd13David Gergely gerd13 Data 3 martie 2016 01:15:05
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <fstream>
#include <queue>
#include <algorithm>
#include <cstring>

using namespace std ;

const int MMAX = 100005 ;
const int NMAX = 50005 ;
const int INF = 0x3f3f3f3f ;


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

int D[NMAX], N, S, M, sol[NMAX];
int T ;
queue <int> Q;

inline void Dijkstra(vector <pair <int, int> > V[NMAX])
{
    sol[S] = 0 ;

    Q.push(S) ;

    while(!Q.empty())
    {
        int newnode = Q.front();
        Q.pop() ;

        for(vector <pair <int, int> > ::iterator it = V[newnode].begin(); it != V[newnode].end() ; ++ it)
            if(sol[it -> first] > sol[newnode] + it -> second)
            {

                sol[it -> first] = sol[newnode] + it -> second ;
                Q.push(it -> first) ;
            }
    }


}


int main()
{
    fin >> T ;
    while(T --)
    {
        fin >> N >> M >> S ;

        vector <pair <int, int> > V[MMAX] ;
        memset(D, 0, sizeof D) ;
        memset(sol, INF, sizeof sol);

        for(int i = 1 ; i <= N ; ++ i)
            fin >> D[i] ;

        for(int i = 1 ; i <= M ; ++ i)
        {
            int x, y , cost ;

            fin >> x >> y >> cost ;

            V[x].push_back(make_pair(y, cost)) ;
            V[y].push_back(make_pair(x, cost)) ;
        }

        Dijkstra(V) ;

        bool ok = true ;

        for(int i = 1 ; i <= N ; ++ i)
            if(D[i]!= sol[i])
            {
                fout << "NU\n" ;
                ok = false ;
                break ;

            }

        if(ok)
            fout << "DA\n" ;



    }

    fin.close() ;
    fout.close() ;
    return 0 ;
}