Cod sursa(job #954285)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 28 mai 2013 20:55:50
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include<stdio.h>
#include<string.h>
#include<queue>
#include<vector>
#include<algorithm>

#define x first
#define y second
#define NMAX 50007

using namespace std;

vector < pair < int , int > > v[NMAX];
priority_queue< pair < int , int > > q;
int Dist[NMAX] , dist[NMAX];
int N , M , S , a , b , c , T;
bool ap[NMAX];

void dijkstra(int S)
{
    q.push(make_pair(0 , S));
    memset(ap , 0 , sizeof(ap));
    dist[S] = 0;
    while(! q.empty())
    {
        int nod = q.top().y;
        if(ap[nod] == false)
        {
            ap[nod] = true;
            for(int i = 0 ; i < v[nod].size() ; ++ i)
            {
                pair<int , int> val = v[nod][i];
                if(dist[nod] + val.y < dist[val.x])
                {
                    dist[val.x] = val.y + dist[nod];
                    q.push(make_pair(- dist[val.x] , val.x));
                }
            }
        }
        q.pop();
    }
}

int main()
{
    freopen("distante.in" , "r" , stdin);
    freopen("distante.out" , "w" , stdout);
    scanf("%d" , &T);
    for( ; T > 0 ; -- T)
    {
        scanf("%d %d %d" , &N , &M , &S);
        for(int i = 1 ; i <= N ; ++ i)
            scanf("%d" , &Dist[i]) , dist[i] = 20000000;
        for(int i = 1 ; i <= M ; ++ i)
        {
            scanf("%d %d %d" , &a , &b , &c);
            v[a].push_back(make_pair(b , c));
            v[b].push_back(make_pair(a , c));
        }

        dijkstra(S);

        int ok = 0;
        ///for(int i = 1 ; i <= N ; ++ i)
            ///printf("%d " , dist[i]);
        for(int i = 1 ; i <= N ; ++ i)
            if(Dist[i] != dist[i])
                ok = 1;
        if(ok == 0)
            printf("DA\n");
        else
            printf("NU\n");
    }
}