Cod sursa(job #1647701)

Utilizator coolyonutzepure ionut coolyonutz Data 10 martie 2016 21:42:49
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>

#define INF 2000000000

using namespace std;


int t,j,n,m,inc,verif[50002],d[50001];

struct graf
{
    int nod,val;
};

struct cmp
{
    bool operator()(int a, int b)
    {
        return d[a]>d[b];
    }
};

vector <graf> G[50002];
priority_queue <int, vector<int>, cmp> q;

void dijkstra(int inc)
{
    q.push(inc);
    while(!q.empty())
    {
        int vf=q.top();
        q.pop();

        for(int i=0; i<G[vf].size(); i++)
        {
            if(d[vf]+G[vf][i].val<d[G[vf][i].nod])
            {
                d[G[vf][i].nod]=d[vf]+G[vf][i].val;
                q.push(G[vf][i].nod);
            }
        }
    }
}

int main()
{
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);

    int i;

    scanf("%d",&t);

    for(int j=1; j<=t; j++)
    {
        scanf("%d %d %d",&n,&m,&inc);

        for(i=1; i<=n; i++) scanf("%d",&verif[i]);

        for(i=1; i<=m; i++)
        {
            graf aux;
            int x;

            scanf("%d %d %d",&x,&aux.nod,&aux.val);
            G[x].push_back(aux);
        }

        for(i=1; i<=n; i++) d[i]=INF;
        d[inc]=0;

        dijkstra(inc);

        bool flag=0;
        for(i=1; i<=n && !flag; i++)
        {
            if(d[i]==INF) d[i]=0;
            if(verif[i]!=d[i]) flag=1;
        }

        if(!flag) printf("DA\n");
        else printf("NU\n");


        for(i=1; i<=n; i++)
            while(G[i].size()) G[i].pop_back();

    }


}